预览效果图如下:
主要的方法是重写VIEw.ontouchEvent( MotionEvent event ),常用的三个 *** 作:ACTION_DOWN 手指触摸屏幕 ; ACTION_UP 手指离开屏幕;
ACTION_MOVE手指在屏幕滑动。
如果该方法返回true ,表示该事件已经被VIEw处理,不再向上层的VIEw或Activity传递 ; 如果返回false, 表示事件未处理,继续传递。
具体代码如下:
package com.ninegrID;import androID.content.Context;import androID.graphics.Canvas;import androID.graphics.color;import androID.graphics.Paint;import androID.util.AttributeSet;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;/** * Created by administrator on 2017/6/24. */public class SuduVIEw extends VIEw { //定义默认常量 private static final int DEFAulT_CELL_WIDTH = 200 ; private static final int DEFAulT_CELL_stroke_WIDTH = 10 ; private static final int DEFAulT_SPACE = 100 ; //九宫格数组 private Cell mCells[] = new Cell[9] ; //直径 private int mCellWIDth; //半径 private int mCellRadius; //边框宽度 private int mCellstrokeWIDth; //空白部分 private int mSpace ; //定义画笔 private Paint mPaintnormal ; private Paint mPaintSelected ; private float mCurrentX ; private float mCurrentY ; //判断是否结束的标识 private boolean mFinish = false ; private StringBuffer mSbSelected = new StringBuffer(20); public SuduVIEw(Context context) { super(context); init(); } public SuduVIEw(Context context,AttributeSet attrs) { super(context,attrs); init(); } public SuduVIEw(Context context,AttributeSet attrs,int defStyleAttr) { super(context,attrs,defStyleAttr); init(); } private voID init(){ //初始化画笔 mCellWIDth = DEFAulT_CELL_WIDTH ; mCellRadius = DEFAulT_CELL_WIDTH >> 1 ; mCellstrokeWIDth = DEFAulT_CELL_stroke_WIDTH ; mSpace = DEFAulT_SPACE ; mPaintnormal = new Paint(); mPaintnormal.setcolor(color.WHITE); mPaintnormal.setstrokeWIDth(mCellstrokeWIDth); mPaintnormal.setStyle(Paint.Style.stroke); mPaintnormal.setAntiAlias(true); mPaintSelected = new Paint(); mPaintSelected.setcolor(color.CYAN); mPaintSelected.setstrokeWIDth(mCellstrokeWIDth); mPaintSelected.setStyle(Paint.Style.stroke); mPaintSelected.setAntiAlias(true); Cell cell ; float x; float y; //计算每个格子的坐标 for( int i = 0 ; i < 9 ; i ++ ){ x = mSpace * ( i%3 + 1 ) + mCellRadius + mCellWIDth * ( i%3 ) ; y = mSpace * ( i/3 + 1 ) + mCellRadius + mCellWIDth * ( i/3 ) ; cell = new Cell(x,y); mCells[i] = cell ; } } @OverrIDe protected voID onDraw(Canvas canvas) { super.onDraw(canvas); drawCell(canvas); drawline(canvas); } //绘制连接线 private voID drawline( Canvas canvas ){ if("".equals(mSbSelected.toString())){ return; } String[] selectedindexs = mSbSelected.toString().split(","); Cell cell = mCells[Integer.valueOf(selectedindexs[0])]; Cell nextCell ; //绘制每两个格子中心点之间的连接线 if( selectedindexs.length > 1) { for (int i = 1; i < selectedindexs.length; i++) { nextCell = mCells[Integer.valueOf(selectedindexs[i])]; canvas.drawline(cell.getCenterX(),cell.getCenterY(),nextCell.getCenterX(),nextCell.getCenterY(),mPaintSelected); cell = nextCell; } } //绘制格子到其他空白位置的连接线 if( !mFinish ) { canvas.drawline(cell.getCenterX(),mCurrentX,mCurrentY,mPaintSelected); } } private voID drawCell( Canvas canvas ){ for ( int i = 0 ; i < 9 ; i ++ ){ canvas.drawCircle(mCells[i].getCenterX(),mCells[i].getCenterY(),mCellRadius,mCells[i].isSelected() ? mPaintSelected : mPaintnormal ); } } //处理点击事件 @OverrIDe public boolean ontouchEvent(MotionEvent event) { switch ( event.getAction()){ case MotionEvent.ACTION_DOWN: //如果手指已经松开,则所有格子变为初始状态 if( mFinish ){ for ( int i = 0 ; i < 9 ; i ++ ){ mCells[i].setSelected(false); } mFinish = false ; mSbSelected.delete(0,mSbSelected.length()); invalIDate(); return false; } handleDownEvent(event); break; //松开则结束 case MotionEvent.ACTION_UP: mFinish = true ; break; case MotionEvent.ACTION_MOVE: handleMoveEvent(event); break; } //表示已处理,不向上传递 return true ; } //处理手指移动的事件 private voID handleMoveEvent( MotionEvent event ){ int index = findCellindex(event.getX(),event.getY()); if( index != -1 ){ mCells[index].setSelected(true); mSbSelected.append(index).append(","); } invalIDate(); mCurrentX = event.getX(); mCurrentY = event.getY(); } //处理手指按下的事件 private voID handleDownEvent( MotionEvent event){ int index = findCellindex(event.getX(),"); invalIDate(); } mCurrentX = event.getX(); mCurrentY = event.getY(); } //根据坐标判断点击的哪个格子 private int findCellindex( float x,float y){ float cellX ; float cellY ; int result = -1 ; for( int i = 0 ; i < 9 ; i ++ ){ if( mCells[i].isSelected()){ continue; } //获取每个格子的坐标 cellX = mCells[i].getCenterX(); cellY = mCells[i].getCenterY(); //计算按下的点到每个格子的距离 float tempX = cellX - x ; float tempY = cellY - y ; float distance = (float) Math.sqrt(tempX * tempX + tempY * tempY); //如果点击的位置在某个格子的圆内 if( distance < mCellRadius ){ result = i ; break; } } //返回该格子的位置 return result ; }}
最后在布局文件中引用该VIEw即可,若想实现更高的定制性,可以仿照上一篇文章重写VIEw的onMearsure方法并增加自定义属性。
以上所述是小编给大家介绍的AndroID 自定义九宫格手势锁,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
总结以上是内存溢出为你收集整理的Android 自定义九宫格手势锁全部内容,希望文章能够帮你解决Android 自定义九宫格手势锁所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)