1. 程式人生 > >Android 滑動驗證的一種簡單實現

Android 滑動驗證的一種簡單實現

VerifyView.java

package com.zjl.customview;

import java.util.Random;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/**
 * @author ZhengJingle
 */
public class VerifyView extends View{

	Bitmap bitmap;//原圖
	Bitmap drawBitmap;//背景圖
	Bitmap verifyBitmap;//驗證圖
	boolean reCalc=true;//是否需要重新計算
	int x;//隨機選取的位置
	int y;
	int left,top,right,bottom;//驗證的地方
	int moveX;//移動x座標
	int moveMax;//最大移動
	int trueX;//正確移動的x座標
	
	public VerifyView(Context context) {
		super(context);
		// TODO 自動生成的建構函式存根
	}

	public VerifyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO 自動生成的建構函式存根
	}

	public VerifyView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		// TODO 自動生成的建構函式存根
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO 自動生成的方法存根
		super.onDraw(canvas);
		if(bitmap==null)return;
		
		if(reCalc){
			/*
			 * 背景圖
			 */
			int width=getWidth();
			int height=getHeight();
		
    		drawBitmap=Bitmap.createScaledBitmap(bitmap, width, height, false);
    		
    		/*
    		 * 驗證的地方
    		 */
    		int length=width>height?height:width;//正方形
    		length/=4;//1/4長度
    		
    		x=new Random().nextInt(width-length*2)+length;//隨機選取的位置
    		y=new Random().nextInt(height-length*2)+length;
    		
    		left=x;
	    	top=y;
	    	right=left+length;
    		bottom=top+length;
	    	
    		//驗證的圖片
    		verifyBitmap=Bitmap.createBitmap(drawBitmap, x, y, length, length);
    		
    		//驗證圖片的最大移動距離
    		moveMax=width-length;
    		//正確的驗證位置x
    		trueX=x;
    		
    		reCalc=false;//下次不用再進入這個if
		}
		
		Paint paint=new Paint();
		canvas.drawBitmap(drawBitmap, 0, 0, paint);//畫背景圖
		paint.setColor(Color.parseColor("#55000000"));
		canvas.drawRect(left, top, right, bottom, paint);//畫上陰影
		paint.setColor(Color.parseColor("#ffffffff"));
		canvas.drawBitmap(verifyBitmap, moveX, y, paint);//畫驗證圖片
		
	}
	
	public void setImageBitmap(Bitmap bitmap){
		this.bitmap=bitmap;
	}
	
	public void setMove(double precent){
		if(precent<0 || precent>1)return;
		
		moveX=(int) (moveMax*precent);
		invalidate();
	}
	
	public boolean isTrue(double range){
		if(moveX>trueX*(1-range) && moveX<trueX*(1+range)){
			return true;
		}else{
			return false;
		}
	}
	
	public void setReDraw(){
		reCalc=true;
		invalidate();
	}
}

MainActivity.java

package com.example;

import com.example.verifyview.R;
import com.zjl.customview.VerifyView;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
/**
 * @author ZhengJingle
 */
public class MainActivity extends Activity{
	
	VerifyView verifyView;
	SeekBar seekBar;
	Button button1;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        verifyView=(VerifyView)findViewById(R.id.verifyView1);
        verifyView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.picture));
        
        seekBar=(SeekBar)findViewById(R.id.seekBar1);
        seekBar.setMax(10000);
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO 自動生成的方法存根
				verifyView.setMove(progress*0.0001);
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO 自動生成的方法存根
				
			}

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO 自動生成的方法存根
				
			}
        	
        });
        seekBar.setOnTouchListener(new OnTouchListener(){

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO 自動生成的方法存根
				switch(event.getAction()){
				case MotionEvent.ACTION_UP:
					boolean isTrue=verifyView.isTrue(0.02);//允許有2%誤差
					if(isTrue){
						showToast("驗證成功");
					}
					break;
				}
				return false;
			}
        	
        });
        
        button1=(Button)findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO 自動生成的方法存根
				reInit();
			}
        	
        });
        
    }
    
    Toast toast;
    void showToast(String msg){
    	if(toast!=null)toast.cancel();
    	
    	toast=Toast.makeText(this, msg, Toast.LENGTH_SHORT);
    	toast.show();
    }
    
    void reInit(){
    	verifyView.setReDraw();
    	seekBar.setProgress(0);
    }
}

詳細專案: