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);
    }
}


详细项目:

https://github.com/zhengjingle/VerifyView

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值