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

 更新时间:2023年02月27日 16:11:41   作者:似曾相识2022  
这篇文章主要为大家介绍了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监听home键的方法详解

    Android监听home键的方法详解

    这篇文章主要介绍了Android监听home键的方法,结合实例形式较为详细的分析了Android实现监听home键的原理与具体实现技巧,需要的朋友可以参考下
    2016-02-02
  • 详解Flutter如何完全自定义TabBar

    详解Flutter如何完全自定义TabBar

    在App中TabBar形式交互是非常常见的,但是系统提供的的样式大多数又不能满足我们产品和UI的想法,本文记录了在Flutter中如何实现自定义TabBar的一个思路和过程,需要的可以参考一下
    2022-04-04
  • 解决Android popupWindow设置背景透明度无效的问题

    解决Android popupWindow设置背景透明度无效的问题

    这篇文章主要介绍了解决Android popupWindow设置背景透明度无效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Android自定义单选多选下拉列表的实例代码

    Android自定义单选多选下拉列表的实例代码

    本篇文章主要介绍了Android自定义单选多选下拉列表的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android组件化原理详细介绍

    Android组件化原理详细介绍

    这篇文章主要介绍了Android组件化原理详细介绍,组件化架构的目的是让各个业务变得相对独立,各个组件在组件模式下可以独立开发调试
    2022-07-07
  • Android自定义控件实现UC浏览器语音搜索效果

    Android自定义控件实现UC浏览器语音搜索效果

    这篇文章主要为大家详细介绍了Android自定义控件实现UC浏览器语音搜索效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Android使用popUpWindow带遮罩层的弹出框

    Android使用popUpWindow带遮罩层的弹出框

    这篇文章主要为大家详细介绍了Android使用popUpWindow带遮罩层的弹出框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Android调用手机摄像头拍照和录音功能

    Android调用手机摄像头拍照和录音功能

    这篇文章主要为大家详细介绍了Android调用手机摄像头拍照和录音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Android IntentService详解及使用实例

    Android IntentService详解及使用实例

    这篇文章主要介绍了Android IntentService详解及使用实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • android listview初步学习实例代码

    android listview初步学习实例代码

    这篇文章主要介绍了android listview初步学习实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论