Android自定义有限制区域图例角度自识别涂鸦工具类
自定义View分为继承自View和ViewGroup,继承ViewGroup相比继承View
- 在事件分发上ViewGroup多dispatchTouchEvent(事件分发)和onInterceptTouchEvent(事件拦截)两个方法
- 在继承上ViewGroup需要着重处理onmeasure(测量)与onLayout(控制位置等),而继承View重点在于onDrow(绘制)上
这篇我们就简单实现一个自定义签名类,通过手指触摸屏幕移动,显示手指滑过的路径。首先创建SignatureView并继承自View:
class SignatureView constructor(context: Context?, attrs: AttributeSet? = null) : View(context, attrs, 0) { private lateinit var paint: Paint private var mWidth = 0 //父类宽度 private var mHeight = 0//父类高度 override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) mWidth = MeasureSpec.getSize(widthMeasureSpec) mHeight = MeasureSpec.getSize(heightMeasureSpec) paint = Paint() //设置抗锯齿 paint.isAntiAlias = true //设置签名笔画样式 paint.style = Paint.Style.STROKE setMeasuredDimension(mWidth, mHeight) } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) ...... } }
接下来需要做的其实就只有触摸事件处理和绘制路径两个任务了。绘制需要在onDraw中通过咱们初始化的画笔paint和canvas完成,那么触摸事件则需要重写onTouchEvent方法监听:
override fun onTouchEvent(event: MotionEvent): Boolean { super.onTouchEvent(event) }
这里需要注意,由于签名是实时记录的,所以我们需要记录下滑动的点,将其连接成一条线,再通过pain画线。画的过程是按下移动的操作,所以在ACTION_MOVE的过程我们需要实时画线。画笔完成是抬起的动作,所以在ACTION_UP时我们需要将之前的所有点绘制在画布上。这里通过一个点的集合收集手指移动的点,用户画笔绘制。
//收集用户绘制的点 private var allPoints: MutableList<Point> = ArrayList() val p = Point(event.x.toInt(), event.y.toInt()) when (event.action) { MotionEvent.ACTION_DOWN -> { //用户按下,表示重新开始保存点 allPoints.clear() allPoints.add(p) } MotionEvent.ACTION_UP -> { postInvalidate() //重绘图像 } MotionEvent.ACTION_MOVE -> { allPoints.add(p) postInvalidate() //子线程可刷新 } }
接下来就是在onDrow()中绘制,通过canvas.drawLine:
val first = allPoints[0] //第一个点 val last = allPoints[allPoints.size-1] //最后一个点 canvas.drawLine(first.x.toFloat(),first.y.toFloat(),last.x.toFloat(),last.y.toFloat(),paint)
到这里基本就结束了,但我们还需要撤回和清除的功能。这时候就需要想一想了,如果按照按下—>移动—>抬起为一笔,那么撤回的话就需要将这个过程的所有点都清除。此时我们就可以将这个过程想象成一条线,在按下时记录线的开始,抬起记录线的结束,再将这条线存放在一个集合中,如果需要撤回就将这条数据删除。
//用于画完图后的显示,在抬起时,添加来自于allPoints的所有点的数据 private var allList: MutableList<List<Point>> = ArrayList() //用于划线过程中的显示,当集合allList存储后,清空本集合中所有数据 private var allPoints: MutableList<Point> = ArrayList() override fun onTouchEvent(event: MotionEvent): Boolean { super.onTouchEvent(event) val p = Point(event.x.toInt(), event.y.toInt()) when (event.action) { MotionEvent.ACTION_DOWN -> { //用户按下,表示重新开始保存点 allPoints = ArrayList() allPoints.add(p) } MotionEvent.ACTION_UP -> { //用户松开 allList.add(allPoints) allPoints = ArrayList() //添加集合后,清除子集合 postInvalidate() //重绘图像 } MotionEvent.ACTION_MOVE -> { allPoints.add(p) postInvalidate() //子线程可刷新 } } return true } //上一步(清除本次绘画) fun clearLatestData() { if (allList.size > 0) { allList.removeAt(allList.size - 1) paints.removeAt(paints.size - 1) } postInvalidate() }
清除就更简单了,直接清空集合中的所有线条即可,但一定不要忘记刷新视图:
//重置(清除所有绘画) fun clearAllData() { allList.clear() postInvalidate() }
总结
其实整套下来说难也不难,主要涉及的就是继承自View方式的自定义View。由易而难,先实现最基础的功能,通过触摸事件的不同动作采集我们需要的数据,再配合onDrow方法绘制出采集的线条,一定不要忘记刷新视图。撤回或者说多颜色,多样式的线条其实都是可以通过容器收集线条,针对不同的线条设置画笔(paint)属性达到需求的。这篇就讲到这里希望对大家有所帮助,下篇咱们讲讲异形区域限制画笔区域问题。
以上就是Android自定义有限制区域图例角度自识别涂鸦工具类的详细内容,更多关于Android限制区域涂鸦工具类的资料请关注脚本之家其它相关文章!
相关文章
Android编程添加快捷方式(Short)到手机桌面的方法(含添加,删除及查询)
这篇文章主要介绍了Android编程添加快捷方式(Short)到手机桌面的方法,含有针对桌面快捷方式的添加,删除及查询的操作实现技巧,需要的朋友可以参考下2016-01-01Android TextView实现点击显示全文与隐藏功能(附源码)
TextView用法很多,用到的地方更是普遍,所以学好TextView的使用很重要很重要很重要。下面这篇文章主要介绍了Android中TextView实现显示全文与隐藏功能的相关资料,文中给出了详细的示例代码和源码下载,需要的朋友可以参考下。2017-03-03Android开发之DatePicker和TimePicker实现选择日期时间功能示例
这篇文章主要介绍了Android开发之DatePicker和TimePicker实现选择日期时间功能,结合实例形式分析了Android DatePicker和TimePicker组件的功能、常用函数、布局及日期时间选择相关操作技巧,需要的朋友可以参考下2019-03-03Bootstrap 下拉菜单.dropdown的具体使用方法
这篇文章主要介绍了Bootstrap 下拉菜单.dropdown的具体使用方法,详细讲解下拉菜单的交互,有兴趣的可以了解一下2017-10-10
最新评论