返回顶部
首页 > 资讯 > 精选 >Android如何自定义有限制区域图例角度自识别涂鸦工具类
  • 304
分享到

Android如何自定义有限制区域图例角度自识别涂鸦工具类

2023-07-05 07:07:28 304人浏览 薄情痞子
摘要

今天小编给大家分享一下Android如何自定义有限制区域图例角度自识别涂鸦工具类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧

今天小编给大家分享一下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)

到这里基本就结束了,但我们还需要撤回和清除的功能。这时候就需要想一想了,如果按照按下&mdash;>移动&mdash;>抬起为一笔,那么撤回的话就需要将这个过程的所有点都清除。此时我们就可以将这个过程想象成一条线,在按下时记录线的开始,抬起记录线的结束,再将这条线存放在一个集合中,如果需要撤回就将这条数据删除。

//用于画完图后的显示,在抬起时,添加来自于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()}

以上就是“Android如何自定义有限制区域图例角度自识别涂鸦工具类”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Android如何自定义有限制区域图例角度自识别涂鸦工具类

本文链接: https://lsjlt.com/news/350205.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作