Android 滑動驗證的一種簡單實現
阿新 • • 發佈:2019-02-01
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); } }
詳細專案: