
先看看效果图:
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手势密码简单版所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)