最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類

 更新時間:2023年02月27日 16:11:41   作者:似曾相識2022  
這篇文章主要為大家介紹了Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

自定義View分為繼承自View和ViewGroup,繼承ViewGroup相比繼承View

  • 在事件分發(fā)上ViewGroup多dispatchTouchEvent(事件分發(fā))和onInterceptTouchEvent(事件攔截)兩個方法
  • 在繼承上ViewGroup需要著重處理onmeasure(測量)與onLayout(控制位置等),而繼承View重點在于onDrow(繪制)上

這篇我們就簡單實現(xiàn)一個自定義簽名類,通過手指觸摸屏幕移動,顯示手指滑過的路徑。首先創(chuàng)建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()
        //設(shè)置抗鋸齒
        paint.isAntiAlias = true
        //設(shè)置簽名筆畫樣式
        paint.style = Paint.Style.STROKE
        setMeasuredDimension(mWidth, mHeight)
   }
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        ......
    }
}

接下來需要做的其實就只有觸摸事件處理和繪制路徑兩個任務(wù)了。繪制需要在onDraw中通過咱們初始化的畫筆paint和canvas完成,那么觸摸事件則需要重寫onTouchEvent方法監(jiān)聽:

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)

到這里基本就結(jié)束了,但我們還需要撤回和清除的功能。這時候就需要想一想了,如果按照按下—>移動—>抬起為一筆,那么撤回的話就需要將這個過程的所有點都清除。此時我們就可以將這個過程想象成一條線,在按下時記錄線的開始,抬起記錄線的結(jié)束,再將這條線存放在一個集合中,如果需要撤回就將這條數(shù)據(jù)刪除。

//用于畫完圖后的顯示,在抬起時,添加來自于allPoints的所有點的數(shù)據(jù)
private var allList: MutableList<List<Point>> = ArrayList()
//用于劃線過程中的顯示,當集合allList存儲后,清空本集合中所有數(shù)據(jù)
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()
}

總結(jié)

其實整套下來說難也不難,主要涉及的就是繼承自View方式的自定義View。由易而難,先實現(xiàn)最基礎(chǔ)的功能,通過觸摸事件的不同動作采集我們需要的數(shù)據(jù),再配合onDrow方法繪制出采集的線條,一定不要忘記刷新視圖。撤回或者說多顏色,多樣式的線條其實都是可以通過容器收集線條,針對不同的線條設(shè)置畫筆(paint)屬性達到需求的。這篇就講到這里希望對大家有所幫助,下篇咱們講講異形區(qū)域限制畫筆區(qū)域問題。

以上就是Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類的詳細內(nèi)容,更多關(guān)于Android限制區(qū)域涂鴉工具類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android 列表倒計時的實現(xiàn)的示例代碼(CountDownTimer)

    Android 列表倒計時的實現(xiàn)的示例代碼(CountDownTimer)

    本篇文章主要介紹了Android 列表倒計時的實現(xiàn)的示例代碼(CountDownTimer),具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • android 使用Xml文件定義Shape方式

    android 使用Xml文件定義Shape方式

    這篇文章主要介紹了android 使用Xml文件定義Shape方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • android 自定義view實現(xiàn)彩虹進度條功能

    android 自定義view實現(xiàn)彩虹進度條功能

    實現(xiàn)一個彩虹色進度條功能,不說明具體用途大家應(yīng)該能猜到,想找別人造的輪子,但是沒有合適的,所以決定自己實現(xiàn)一個,下面小編通過實例代碼給大家分享android 自定義view實現(xiàn)彩虹進度條功能,感興趣的朋友一起看看吧
    2024-06-06
  • Android開發(fā)使用Databinding實現(xiàn)關(guān)注功能mvvp

    Android開發(fā)使用Databinding實現(xiàn)關(guān)注功能mvvp

    這篇文章主要為大家介紹了Android開發(fā)使用Databinding實現(xiàn)關(guān)注功能mvvp示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • App中如何獲取gradle的配置信息

    App中如何獲取gradle的配置信息

    這篇文章主要給大家介紹了關(guān)于App中如何獲取gradle的配置信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Flutter添加頁面過渡動畫實現(xiàn)步驟

    Flutter添加頁面過渡動畫實現(xiàn)步驟

    這篇文章主要為大家介紹了Flutter添加頁面過渡動畫,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Android開發(fā)之Flutter與webview通信橋梁實現(xiàn)

    Android開發(fā)之Flutter與webview通信橋梁實現(xiàn)

    這篇文章主要為大家介紹了Android開發(fā)之Flutter與webview通信橋梁實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Android?WebView緩存機制優(yōu)化加載慢問題

    Android?WebView緩存機制優(yōu)化加載慢問題

    我知道你一定在煩惱Android?Webview的性能問題,特別突出的是-加載速度慢、消耗流量,針對Android?Webview的性能問題,提出一些有效解決方案
    2023-02-02
  • android 大圖片拖拽并縮放實現(xiàn)原理

    android 大圖片拖拽并縮放實現(xiàn)原理

    android 大圖片拖拽縮放有利于用戶體驗,在開發(fā)過程中經(jīng)常使用到,這篇圖片拖拽縮放也是我在項目中用到的,今天整理一下,將源碼奉獻給大家,希望對大家以后碰到相似的問題有幫助
    2013-01-01
  • 詳解Android studio中正確引入so文件的方法

    詳解Android studio中正確引入so文件的方法

    本篇文章主要介紹了Android studio中正確引入so文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

琼海市| 黔南| 五大连池市| 临朐县| 大姚县| 阿拉善左旗| 尤溪县| 郎溪县| 桐柏县| 夏河县| 扶绥县| 岫岩| 德惠市| 花垣县| 万年县| 林甸县| 武强县| 若羌县| 雷州市| 万州区| 梨树县| 常熟市| 昌都县| 从江县| 海盐县| 临城县| 汝城县| 巩义市| 绍兴市| 饶平县| 调兵山市| 安康市| 洪泽县| 河池市| 莱阳市| 区。| 宿松县| 东兰县| 庄浪县| 黄冈市| 河津市|