<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上文Android:實現一個自定義有限制區域的圖例(角度自識別)塗鴉工具類(上)中我們已經實現了自定義View簽名的功能,包含撤回、清除方法。但我們最終要實現的功能還不止如此,這篇我們就來說說給限制區域內簽名的實現過程。
試想,既然是自定義View了,那麼如果要限制使用者在指定區域內簽名,最好的辦法不是在觸控的時候通過座標點的判斷新增一些攔截嗎?沒錯,起初我也是這麼想的,但是再看到限制區域的圖形後,我陷入了深深的沉思......
沒錯,就是這樣的圖,這還是其中的一張,後期指不定還會有多少張這樣形狀複雜的圖。單看組成就不得了,都是些大小不一的圓相交相切,圓心散落在各個位置。但從自定義角度繪製這樣的圖形相信難度也不小,就更不要說通過座標點的計算來攔截觸控事件的方式限制簽名範圍了。
此時絕望的我突然想起之前專案中的一個上傳圖片功能,當時是利用了ViewGroup作為遮罩來簡單實現的,那麼,這個功能其實也可如此。我們大可不必大費周章的採用觸控事件判斷呀,超出範圍如果使用畫布遮擋其實也能滿足。結合專案需求最後塗鴉完成後,需要生成圖片,我們也可通過View自帶的Draw方法生成圖片,咱們說幹就幹。
首先,自定義一個ViewGroup(作為遮罩、生成圖片使用)
class FaceViewGroup(context: Context, attrs: AttributeSet? = null) : LinearLayout(context, attrs, 0) { private var mWith = 0 private var mHight = 0 override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) mWith = MeasureSpec.getSize(widthMeasureSpec) mHight = MeasureSpec.getSize(heightMeasureSpec) } override fun dispatchDraw(canvas: Canvas?) { ...... } }
這裡我們需要了解下dispatchDraw方法:
繪製 ViewGroup 中的子 View 時,會呼叫 dispatchDraw(Canvas canvas),需要注意的是,是在繪製 ViewGroup 自己之後,也就是在 onDraw(Canvas canvas) 之後。
最後才會觸發這個方法,所以利用它繪製遮罩再合適不過,我們可以讓UI將各種複雜的圖形切出來儲存再本地,再利用dispatchDraw方法中的畫布將圖片繪製在中心。切圖時需要注意,我們需要繪製的區域需要透明。
//本地區域圖 val bitmap = BitmapFactory.decodeResource(resources,R.mipmap.ic_face) //繪製到ViewGroup中 canvas?.drawBitmap(bitmap, (mWith-bitmap.width)/2f, (mHight-bitmap.height)/2f, Paint().apply { color = Color.WHITE isAntiAlias = true style = Paint.Style.FILL })
在Xml:
<com.example.FaceViewGroup android:id="@+id/group" android:layout_width="414dp" android:layout_height="280dp"> <com.example.SignatureView android:id="@+id/linePath" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="2dp" /> </com.example.FaceViewGroup>
SignatureView就是我們上篇講到的自定義View,執行起來發現效果還不錯,確實實現了限制的問題,雖然不是真正意義上的限制,但效果一樣,滿足需求了。最後生成圖片:
val bitmap: Bitmap = Bitmap.createBitmap( resources.displayMetrics, binding.group.width, binding.group.height, Bitmap.Config.ARGB_8888 ) val canvas = Canvas(bitmap) binding.group.setBackgroundColor(ContextCompat.getColor(this, R.color.white)) //解決白底問題 canvas.drawRect( Rect( 0, 0, bitmap.width, bitmap.height ), Paint().apply { color = Color.WHITE style = Paint.Style.FILL }) binding.group.draw(canvas)
這裡說下,如果不設定背景色,通過View的draw方式生成的圖片是黑底的。另外還有個值得注意的點,如果使用了三方ui適配方案,你會發現無論怎麼調整檢視和Bitmap最後生成的圖片和實際繪製看到的圖片存在問題—繪製的內容偏離了限制區域,最終發現需要進行適配,也就是這一步,參考資料:
//這裡需要新增resources.displayMetrics才能適配寬高 val bitmap: Bitmap = Bitmap.createBitmap( resources.displayMetrics, binding.group.width, binding.group.height, Bitmap.Config.ARGB_8888 )
最開始一直以為是橫豎屏的切換導致位置偏移,實則是使用了AndroidAutoSize使得尺寸發生變化,所以在建立Bitmap時需要將適配過後的displayMetrics傳入。到此,我們就完成了異性區域內塗鴉功能。
有時候不能被固定思維所困住,換種思路或許能讓複雜的問題輕鬆解決,但還是需要多積累經驗才行。如果沒有之前的自定義View和上傳圖片的經驗,或許實現上述功能還不能找到簡單的實現方式。好了,這篇就先介紹到這裡,下篇我們將基於本篇的實現上,新增根據手勢自動判斷方向,實現圖例按照手勢移動的方向顯示。
以上就是Android自定義有限制區域圖例角度自識別塗鴉工具類詳解的詳細內容,更多關於Android自識別塗鴉工具類的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45