最近写了个九宫格手势解锁,先附上效果图吧?
上面是效果图,再附上代码?行。
Github 戳我
这篇博客讲述一下实现这个效果的思路。我觉得知道了这个思路,并且顺着这个思路走,每个人都可以自己写一个出来。但是写出来的代码健壮否,就看个人功底了。
创建GestureView继承自View
在这个代码里你只需要做两件事
- 实现onDraw方法
- 实现onTouchEvent方法
记下来我们肢解一下知识点。
在onDraw方法中,需要做四件事:
- 计算获取9个点的坐标和小箭头的三个坐标点
- 初始化9个点圆
- 绘制选中的圆,以及选中的圆的内圆,还有就是圆和圆之间的连接线,以及小箭头
- 绘制最后一条线段,也就是最后一个选中点到你正在触摸移动的线段。
viewImpl.initData(viewWidth, viewHeight); //初始化9个点数据
viewImpl.onDrawInitView(paint, canvas); //初始化View
viewImpl.onDrawSelectView(paint, canvas); //绘制选中的View
viewImpl.onDrawLineView(paint, canvas); //绘制连接线
我们需要重写onTouchEvent,在onTouchEvent方法中我们可以处理三个事件:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN : {
viewImpl.touchDown(event);
break;
}
case MotionEvent.ACTION_MOVE : {
viewImpl.touchMove(event);
break;
}
case MotionEvent.ACTION_UP : {
viewImpl.touchUp(event);
break;
}
}
return true;
}
这三个事件中,一个一个说
- ACTION_DOWN事件,这个事件处理比较简单,我们需要判断当前按下的点是否是有效点,也就是:当前触摸的点是否在9个圆内。 如果不在里面,就不重新绘制View;如果在里面,需要存储下当前的圆的中心点坐标,表示:选中点。我们代码中是:selectPoin