Android自定义UI手势密码简单版

Android自定义UI手势密码简单版,第1张

概述先看看效果图:ImageLockActivitypackagecom.example.imagelock;importcom.example.view.NinePointLineView;

先看看效果图:

ImageLockActivity

package com.example.imagelock;  import com.example.vIEw.NinePointlineVIEw;  import androID.os.Bundle; import androID.app.Activity; import androID.vIEw.Menu; import androID.vIEw.VIEw;  public class ImageLockActivity extends Activity {    @OverrIDe   public voID onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     VIEw v = new NinePointlineVIEw(this);     setContentVIEw(v);   } } 

NinePointlineVIEw

package com.example.vIEw;  import com.example.imagelock.R;  import androID.content.Context; import androID.graphics.Bitmap; import androID.graphics.BitmapFactory; import androID.graphics.Canvas; import androID.graphics.color; import androID.graphics.Paint; import androID.graphics.Paint.Cap; import androID.graphics.Typeface; import androID.util.AttributeSet; import androID.vIEw.MotionEvent; import androID.vIEw.VIEw; import androID.Widget.Toast;  public class NinePointlineVIEw extends VIEw {    /**    * 定义3个Paint,还有一个坐标圆点图片    */   Paint linePaint = new Paint();   Paint whitelinePaint = new Paint();   Paint textPaint = new Paint();   Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.lock);      PointInfo[] points = new PointInfo[9];   int wIDth,height;   //坐标点的半径长度   int defaultBitmapRadius = defaultBitmap.getWIDth() / 2;    //绘制密码时候出现的原点的直径,半径   Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.indicator_lock_area);   int selectedBitmapDiameter = selectedBitmap.getWIDth();   int selectedBitmapRadius = selectedBitmapDiameter / 2;      StringBuffer lockString = new StringBuffer();    Context context;   /** 构造器*********************************************/   public NinePointlineVIEw(Context context) {     super(context);     this.context = context;     this.setBackgroundcolor(color.WHITE);     initPaint();   }    public NinePointlineVIEw(Context context,AttributeSet attrs) {     super(context,attrs);     this.context = context;     this.setBackgroundcolor(color.WHITE);     initPaint();   }   private voID initPaint() {     //线--包裹9个原点     linePaint.setcolor(color.RED);     linePaint.set@R_301_5283@WIDth(defaultBitmap.getWIDth());     linePaint.setAntiAlias(true);     linePaint.set@R_301_5283@Cap(Cap.ROUND);     //线内--比原点直径少5     whitelinePaint.setcolor(color.GREEN);     whitelinePaint.set@R_301_5283@WIDth(defaultBitmap.getWIDth() - 5);     whitelinePaint.setAntiAlias(true);     whitelinePaint.set@R_301_5283@Cap(Cap.ROUND);     //字体设置     textPaint.setTextSize(30);     textPaint.setAntiAlias(true);     textPaint.setTypeface(Typeface.MONOSPACE);   }    /**********************************************************    * 测量    */   @OverrIDe   protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {     wIDth = getWIDth();     height = getHeight();     if (wIDth != 0 && height != 0) {       initPoints(points);     }     super.onMeasure(wIDthMeasureSpec,heightmeasureSpec);   }    /**    * 初始化原点    */   private voID initPoints(PointInfo[] points) {      int len = points.length;      //2个原点的间距     int seletedSpacing = (wIDth - selectedBitmapDiameter * 3) / 4;      //第1个原点的坐标     int seletedX = seletedSpacing;     int seletedY = height - wIDth + seletedSpacing;      //第1个原点内部的小圆的坐标     int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;     int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;      for (int i = 0; i < len; i++) {       //第4、7个原点       if (i == 3 || i == 6) {         seletedX = seletedSpacing;         //第一个原点y坐标+直径+2点间距离         seletedY += selectedBitmapDiameter + seletedSpacing;          defaultX = seletedX + selectedBitmapRadius             - defaultBitmapRadius;         //第一个原点y坐标+直径+2点间距离         defaultY += selectedBitmapDiameter + seletedSpacing;        }       points[i] = new PointInfo(i,defaultX,defaultY,seletedX,seletedY);        //原点坐标xy为直径+2点间距离       seletedX += selectedBitmapDiameter + seletedSpacing;       defaultX += selectedBitmapDiameter + seletedSpacing;      }   }   /*****************************************************************/   @OverrIDe   protected voID onLayout(boolean changed,int left,int top,int right,int bottom) {     super.onLayout(changed,left,top,right,bottom);   }    private int startX = 0,startY = 0;   PointInfo startPoint = null;   @OverrIDe   protected voID onDraw(Canvas canvas) {      drawNinePoint(canvas);      super.onDraw(canvas);   }   /**    *    * @param canvas    */   private voID drawNinePoint(Canvas canvas) {      if (startPoint != null) {       drawEachline(canvas,startPoint);     }      for(PointInfo pointInfo : points) {       if (pointInfo!=null) {                  if (pointInfo.isSelected()) {                 canvas.drawBitmap(selectedBitmap,pointInfo.getSeletedX(),pointInfo.getSeletedY(),null);         }         canvas.drawBitmap(defaultBitmap,pointInfo.getDefaultX(),pointInfo.getDefaultY(),null);       }     }    }   private voID drawEachline(Canvas canvas,PointInfo point) {     if (point.hasNextID()) {       int n = point.getNextID();       drawline(canvas,point.getCenterX(),point.getCenterY(),points[n].getCenterX(),points[n].getCenterY());       drawEachline(canvas,points[n]);     }   }    private voID drawline(Canvas canvas,float startX,float startY,float stopX,float stopY) {     canvas.drawline(startX,startY,stopX,stopY,linePaint);     canvas.drawline(startX,whitelinePaint);   } /**  * ********************************************************************  */   boolean isUp = false;   int moveX,moveY;   @OverrIDe   public boolean ontouchEvent(MotionEvent event) {      boolean flag = true;     //isUp默认是false--绘制是否完毕,此时为true     if (isUp) {       finishDraw();        Toast.makeText(context,"绘制完毕,手指离开,在点击",0).show();       flag = false;      } else {       handlingEvent(event);       flag = true;       Toast.makeText(context,"手指一旦绘制",0).show();      }     //是否处理事件     return flag;   }   private voID finishDraw() {     for (PointInfo temp : points) {       temp.setSelected(false);       temp.setNextID(temp.getID());     }     lockString.delete(0,lockString.length());     isUp = false;     invalIDate();   }    private voID handlingEvent(MotionEvent event) {     switch (event.getAction()) {     case MotionEvent.ACTION_MOVE:       moveX = (int) event.getX();       moveY = (int) event.getY();       for (PointInfo temp : points) {         if (temp.isInMyPlace(moveX,moveY) && temp.isSelected()==false) {           temp.setSelected(true);           startX = temp.getCenterX();           startY = temp.getCenterY();           int len = lockString.length();           if (len != 0) {             int preID = lockString.charat(len - 1) - 48;             points[preID].setNextID(temp.getID());           }           lockString.append(temp.getID());           break;         }       }       invalIDate();       break;      case MotionEvent.ACTION_DOWN:       //获取按下的xy坐标       int downX = (int) event.getX();       int downY = (int) event.getY();       for (PointInfo temp : points) {         //如果符合距离范围内         if (temp.isInMyPlace(downX,downY)) {           //将其设置为选中状态           temp.setSelected(true);           //将选中的圆点设置为起始位置圆点           startPoint = temp;           //将其圆心作为起始点           startX = temp.getCenterX();           startY = temp.getCenterY();           lockString.append(temp.getID());           break;         }       }       invalIDate();       break;      case MotionEvent.ACTION_UP:       startX = startY = moveX = moveY = 0;       //绘制完毕       isUp = true;       invalIDate();       break;     default:       break;     }   }      /**    * 原点bean    */   private class PointInfo {     private boolean selected;      private int ID;      private int nextID;      private int defaultX;      private int defaultY;      private int seletedX;      private int seletedY;      public PointInfo(int ID,int defaultX,int defaultY,int seletedX,int seletedY) {       this.ID = ID;       this.nextID = ID;       this.defaultX = defaultX;       this.defaultY = defaultY;       this.seletedX = seletedX;       this.seletedY = seletedY;     }      public boolean isSelected() {       return selected;     }      public voID setSelected(boolean selected) {       this.selected = selected;     }      public int getID() {       return ID;     }      public int getDefaultX() {       return defaultX;     }      public int getDefaultY() {       return defaultY;     }      public int getSeletedX() {       return seletedX;     }      public int getSeletedY() {       return seletedY;     }      public int getCenterX() {       return seletedX + selectedBitmapRadius;     }      public int getCenterY() {       return seletedY + selectedBitmapRadius;     }      public boolean hasNextID() {       return nextID != ID;     }      public int getNextID() {       return nextID;     }      public voID setNextID(int nextID) {       this.nextID = nextID;     }      /**      * 如果某个xy值在某个原点的左右上下范围内,就说明ok      */     public boolean isInMyPlace(int x,int y) {       boolean inX = x > seletedX           && x < (seletedX + selectedBitmapDiameter);       boolean inY = y > seletedY           && y < (seletedY + selectedBitmapDiameter);        return (inX && inY);     }    }  } 

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

总结

以上是内存溢出为你收集整理的Android自定义UI手势密码简单版全部内容,希望文章能够帮你解决Android自定义UI手势密码简单版所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1147809.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存