轻松实现Android自定义九宫格图案解锁

轻松实现Android自定义九宫格图案解锁,第1张

概述Android实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下:LockPatternView.java

AndroID实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下:

LockPatternVIEw.java

package com.jackIE.lockpattern;  import androID.content.Context; import androID.graphics.Canvas; import androID.graphics.Paint; import androID.graphics.Point; import androID.text.TextUtils; import androID.util.AttributeSet; import androID.util.TypedValue; import androID.vIEw.MotionEvent; import androID.vIEw.VIEw;  import java.util.ArrayList; import java.util.List;  /**  * Created by JackIE on 2015/12/24.  * 图案解锁  */ public class LockPatternVIEw extends VIEw {  /**   * 圆的画笔   */  private Paint mCirclePaint;  /**   * 线的画笔   */  private Paint mlinePaint;  /**   * 圆心数组   */  private PointVIEw[][] mPointVIEwArray = new PointVIEw[3][3];  /**   * 保存选中点的集合   */  private List<PointVIEw> mSelectedPointVIEwList;    /**   * 解锁图案的边长   */  private int mPatternWIDth;   /**   * 图案监听器   */  private OnPatternchangelistener mOnPatternchangelistener;   /**   * 半径   */  private float mRadius;   /**   * 每个圆圈的下标   */  private int mIndex = 1;   /**   * 第一个点是否选中   */  private boolean mIsSelected;  /**   * 是否绘制结束   */  private boolean mIsFinished;   /**   * 正在滑动并且没有任何点选中   */  private boolean mIsMovingWithoutCircle = false;   private float mCurrentX,mCurrentY;   /**   * 正常状态的颜色   */  private static final int norMAL_color = 0xFF70DBDB;  /**   * 选中状态的颜色   */  private static final int SELECTED_color = 0xFF979797;   public LockPatternVIEw(Context context) {   this(context,null);  }   public LockPatternVIEw(Context context,AttributeSet attrs) {   super(context,attrs);    mCirclePaint = new Paint();   mCirclePaint.setAntiAlias(true);   mCirclePaint.setDither(true);   mCirclePaint.setcolor(norMAL_color);   mCirclePaint.setStyle(Paint.Style.FILL);    mlinePaint = new Paint();   mlinePaint.setAntiAlias(true);   mlinePaint.setDither(true);   mlinePaint.setstrokeWIDth(20);   mlinePaint.setcolor(SELECTED_color);   mlinePaint.setStyle(Paint.Style.stroke);    mRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,20,getResources().getdisplayMetrics());    mSelectedPointVIEwList = new ArrayList<>();  }   @OverrIDe  protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {   super.onMeasure(wIDthMeasureSpec,heightmeasureSpec);    //取屏幕长和宽中的较小值作为图案的边长   mPatternWIDth = Math.min(getMeasureDWIDth(),getMeasuredHeight());   setMeasuredDimension(mPatternWIDth,mPatternWIDth);  }   @OverrIDe  protected voID onDraw(Canvas canvas) {   //画圆   drawCircle(canvas);    //将选中的圆重新绘制一遍,将选中的点和未选中的点区别开来   for (PointVIEw pointVIEw : mSelectedPointVIEwList) {    mCirclePaint.setcolor(SELECTED_color);    canvas.drawCircle(pointVIEw.x,pointVIEw.y,mRadius,mCirclePaint);    mCirclePaint.setcolor(norMAL_color); //每重新绘制一个,将画笔的颜色重置,保证不会影响其他圆的绘制   }    //点与点画线   if (mSelectedPointVIEwList.size() > 0) {    Point pointVIEwA = mSelectedPointVIEwList.get(0); //第一个选中的点为A点    for (int i = 0; i < mSelectedPointVIEwList.size(); i++) {     Point pointVIEwB = mSelectedPointVIEwList.get(i); //其他依次遍历出来的点为B点     drawline(canvas,pointVIEwA,pointVIEwB);     pointVIEwA = pointVIEwB;    }     //点与鼠标当前位置绘制轨迹    if (mIsMovingWithoutCircle & !mIsFinished) {     drawline(canvas,new PointVIEw((int)mCurrentX,(int)mCurrentY));    }   }    super.onDraw(canvas);  }   /**   * 画圆   * @param canvas 画布   */  private voID drawCircle(Canvas canvas) {   //初始化点的位置   for (int i = 0; i < mPointVIEwArray.length; i++) {    for (int j = 0; j < mPointVIEwArray.length; j++) {     //圆心的坐标     int cx = mPatternWIDth / 4 * (j + 1);     int cy = mPatternWIDth / 4 * (i + 1);      //将圆心放在一个点数组中     PointVIEw pointVIEw = new PointVIEw(cx,cy);     pointVIEw.setIndex(mIndex);     mPointVIEwArray[i][j] = pointVIEw;     canvas.drawCircle(cx,cy,mCirclePaint);     mIndex++;    }   }    mIndex = 1;  }   /**   * 画线   * @param canvas 画布   * @param pointA 第一个点   * @param pointB 第二个点   */  private voID drawline(Canvas canvas,Point pointA,Point pointB) {   canvas.drawline(pointA.x,pointA.y,pointB.x,pointB.y,mlinePaint);  }   @OverrIDe  public boolean ontouchEvent(MotionEvent event) {   mCurrentX = event.getX();   mCurrentY = event.getY();   PointVIEw selectedPointVIEw = null;    switch(event.getAction()) {    case MotionEvent.ACTION_DOWN:     //重新绘制     if (mOnPatternchangelistener != null) {      mOnPatternchangelistener.onPatternStarted(true);     }      mSelectedPointVIEwList.clear();     mIsFinished = false;      selectedPointVIEw = checkSelectPoint();      if (selectedPointVIEw != null) {      //第一次按下的位置在圆内,被选中      mIsSelected = true;     }     break;    case MotionEvent.ACTION_MOVE:     if (mIsSelected) {      selectedPointVIEw = checkSelectPoint();     }      if (selectedPointVIEw == null) {      mIsMovingWithoutCircle = true;     }     break;    case MotionEvent.ACTION_UP:     mIsFinished = true;     mIsSelected = false;     break;   }    //将选中的点收集起来   if (!mIsFinished && mIsSelected && selectedPointVIEw != null) {    if (!mSelectedPointVIEwList.contains(selectedPointVIEw)) {     mSelectedPointVIEwList.add(selectedPointVIEw);    }   }    if (mIsFinished) {    if (mSelectedPointVIEwList.size() == 1) {     mSelectedPointVIEwList.clear();    } else if (mSelectedPointVIEwList.size() < 5 && mSelectedPointVIEwList.size() > 0) {     //绘制错误     if (mOnPatternchangelistener != null) {      mOnPatternchangelistener.onPatternChange(null);     }    } else {     //绘制成功     String patternPassword = "";     if (mOnPatternchangelistener != null) {      for (PointVIEw pointVIEw : mSelectedPointVIEwList) {       patternPassword += pointVIEw.getIndex();      }       if (!TextUtils.isEmpty(patternPassword)) {       mOnPatternchangelistener.onPatternChange(patternPassword);      }     }    }   }    invalIDate();   return true;  }   /**   * 判断当前按下的位置是否在圆心数组中   * @return 返回选中的点   */  private PointVIEw checkSelectPoint() {   for (int i = 0; i < mPointVIEwArray.length; i++) {    for (int j = 0; j < mPointVIEwArray.length; j++) {     PointVIEw pointVIEw = mPointVIEwArray[i][j];     if (isWithinCircle(mCurrentX,mCurrentY,pointVIEw.x,mRadius)) {      return pointVIEw;     }    }   }    return null;  }   /**   * 判断点是否在圆内   * @param x  点X轴坐标   * @param y  点Y轴坐标   * @param cx  圆心X坐标   * @param cy  圆心Y坐标   * @param radius 半径   * @return  true表示在圆内,false表示在圆外   */  private boolean isWithinCircle(float x,float y,float cx,float cy,float radius) {   //如果点和圆心的距离小于半径,则证明点在圆内   if (Math.sqrt(Math.pow(x - cx,2) + Math.pow(y- cy,2)) <= radius) {    return true;   }    return false;  }   /**   * 设置图案监听器   */  public voID setonPatternchangelistener(OnPatternchangelistener onPatternchangelistener) {   if (onPatternchangelistener != null) {    this.mOnPatternchangelistener = onPatternchangelistener;   }  }   /**   * 图案监听器   */  public interface OnPatternchangelistener {   /**    * 图案改变    * @param patternPassword 图案密码    */   voID onPatternChange(String patternPassword);    /**    * 图案是否重新绘制    * @param isstarted 重新绘制    */   voID onPatternStarted(boolean isstarted);  } } 

PointVIEw.java

package com.jackIE.lockpattern;  import androID.graphics.Point;  /**  * Created by JackIE on 2015/12/25.  * 自定义点对象  */ public class PointVIEw extends Point {  //用于转化密码的下标  public int index;   public PointVIEw(int x,int y) {   super(x,y);  }   public int getIndex() {   return index;  }   public voID setIndex(int index) {   this.index = index;  } } 

MainActivity.java

package com.jackIE.lockpattern;  import androID.app.Activity; import androID.os.Bundle; import androID.Widget.TextVIEw;  public class MainActivity extends Activity implements LockPatternVIEw.OnPatternchangelistener {  private TextVIEw mlockPatternHint;  private LockPatternVIEw mlockPatternVIEw;   @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentVIEw(R.layout.activity_main);    mlockPatternHint = (TextVIEw) findVIEwByID(R.ID.lock_pattern_hint);   mlockPatternVIEw = (LockPatternVIEw) findVIEwByID(R.ID.lock_pattern_vIEw);   mlockPatternVIEw.setonPatternchangelistener(this);   }   @OverrIDe  public voID onPatternChange(String patternPassword) {   if (patternPassword == null) {    mlockPatternHint.setText("至少5个点");   } else {    mlockPatternHint.setText(patternPassword);   }  }   @OverrIDe  public voID onPatternStarted(boolean isstarted) {   if (isstarted) {    mlockPatternHint.setText("请绘制图案");   }  } } 

 效果图如下:

附上源码地址:https://github.com/shineflower/LockPattern.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的轻松实现Android自定义九宫格图案解锁全部内容,希望文章能够帮你解决轻松实现Android自定义九宫格图案解锁所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1147803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存