Android實現(xiàn)自定義View控件的流程詳解
官方自定義控件流程
根據(jù)Android Developers官網(wǎng)的介紹,自定義控件需要以下步驟。(根據(jù)業(yè)務(wù)需要,某些步驟可省略)
1、創(chuàng)建View
2、處理View的布局
3、繪制View
4、與用戶進行交互
5、優(yōu)化已定義的View
上面五項就是Android官方給出的自定義控件步驟。
每個步驟里面又包括了很多細小的知識點??梢杂涀∵@五個點,并且了解每個點里包含的小知識點。再加上一些自定義控件的練習(xí)。將這些知識熟練于心,相信開發(fā)者都能夠定義出優(yōu)秀的自定義控件。接下來對上面列出的5個要點進行細化闡述。
創(chuàng)建View
1.繼承View
自定義的View是繼承于View,當(dāng)然如要自定義的View擁有某些Android已經(jīng)提供的控件功能,可直接繼承于已經(jīng)提供的控件。
2.重寫構(gòu)造方法
- Xxx(Context context)
- Xxx(Context context, AttributeSet attrs)
- Xxx(Context context, AttributeSet attrs, int defStyleAttr)
3.定義自定義屬性
自定義屬性通常寫在res/values/attrs.xml文件中。聲明自定義屬性,都屬于styleable,一般styleable的name和自定義控件的類名一樣。
4.獲取自定義屬性
- 當(dāng)在xml中創(chuàng)建一個view時,所有在xml中聲明的屬性都會被傳入到view的構(gòu)造方法中的AttributeSet類型的參數(shù)當(dāng)中。
- 通過調(diào)用Context的obtainStyledAttributes()方法返回一個TypedArray對象。然后直接用TypedArray對象獲取自定義屬性的值。
- TypedArray對象是共享的資源,因此在獲取完值之后必須要調(diào)用recycle()方法來回收。
測量View(Measure)
1.測量
一個View在展示時是有寬和高,測量View就是為了能夠讓自定義的控件能夠根據(jù)各種不同的情況以合適的寬高去展示。測量就必須要提到onMeasure方法。onMeasure方法是一個view確定寬高的地方。
2.重寫onMeasure的固定偽代碼寫法:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int measureWidth = measure(widthMeasureSpec, true); int measureHeight = measure(heightMeasureSpec, false); setMeasuredDimension(measureWidth, measureHeight); }
計算出height和width之后在onMeasure中要調(diào)用setMeasuredDimension()方法。否則會出現(xiàn)運行時異常。
3.計算一些自定義控件需要的值 onSizeChange()
onSizeChange() 方法在view第一次被指定了大小值、或者view的大小發(fā)生改變時會被調(diào)用。
繪制View(Draw)
1.自定義控件被創(chuàng)建并且測量代碼寫好后,接下來就調(diào)用onDraw()來繪制View
- onDraw方法包含一個Canvas叫做畫布的參數(shù),onDraw()簡單來說就兩點:Canvas決定要去畫什么;Paint決定怎么畫
- Canvas提供了畫線方法,Paint就來決定線的顏色。Canvas提供了畫矩形,Paint又可以決定讓矩形是空心還是實心。
2.在onDraw方法中開始繪制之前
畫筆Paint對象信息要初始化完畢。因為View的重新繪制是比較頻繁的,可能多次調(diào)用onDraw,所以初始化的代碼不應(yīng)該放在onDraw方法里。
3.Paint畫筆
在繪圖過程中起到了極其重要的作用,畫筆主要保存顏色,樣式等繪制信息,指定如何繪制文本和圖形,畫筆對象有很多設(shè)置方法,大體上可以分為兩類,一類與圖形繪制相關(guān),一類與文本繪制相關(guān)。
4.Canvas畫布
當(dāng)調(diào)整好畫筆之后,需要繪制到畫布上,這就得用Canvas類。Canvas畫布可以繪制任何東西。還需要設(shè)置一些關(guān)于畫布的屬性,比如,畫布的顏色、尺寸等。
5.常見繪制操作有哪些
- drawRect,drawRoundRect,繪制矩形
- drawOval,drawCircle,drawArc:繪制橢圓,圓,以及圓弧
- drawText:繪制文本
- drawBitmap:繪制圖片
6.Rect和RectF介紹和區(qū)別
Rect的參數(shù)為int類型,而RectF的參數(shù)類型為float類型,從這一點上來看,RectF的精度更高一些,但是他們都是通過四個坐標(biāo)參數(shù)來確定一個矩形的區(qū)域。
與用戶進行交互
- 某些情況自定義控件不僅只是展示漂亮的樣式,還需要支持用戶點擊,拖動操作。自定義控件就需要做用戶交互這一步。
- 在Android系統(tǒng)中最常見的事件就是觸摸事件,會調(diào)用View的onTouchEvent(android.view.MotionEvent).重寫這個方法去處理事件邏輯。
- 觸控有了更多的手勢,比如輕點,快速滑動等,所以在支持特殊用戶交互的時需要用到android提供的GestureDetector. 只需要實現(xiàn)GestureDetector中相對應(yīng)的接口,并且處理相應(yīng)的回調(diào)方法。
- 除手勢之外,如果有移動之類的情況還需要讓滑動的動畫顯示得比較平滑。動畫應(yīng)該是平滑的開始和結(jié)束,而不是突然消失突然開始。建議使用屬性動畫
優(yōu)化自定義View
在上述步驟結(jié)束之后,其實一個較為完善的自定義控件已經(jīng)出來。接下來需要確保自定義控件運行得流暢,官方說法是:為了避免控件體驗遲緩,確保動畫盡可能保持每秒60幀效果。
官網(wǎng)給出的優(yōu)化建議:
- 1、避免不必要的代碼
- 2、在onDraw()方法中不應(yīng)該有會導(dǎo)致垃圾回收的代碼
- 3、盡可能少讓onDraw()方法調(diào)用,大多數(shù)onDraw()方法調(diào)用都伴隨調(diào)用invalidate(),所以不是必須,不要調(diào)用invalidate()方法。
到此這篇關(guān)于Android實現(xiàn)自定義View控件的流程詳解的文章就介紹到這了,更多相關(guān)Android自定義View控件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin中Lambda表達式與高階函數(shù)使用分析講解
lambda 本質(zhì)上是可以傳遞給函數(shù)的一小段代碼,Kotlin 與 Java 中的 Lambda 有一定的區(qū)別,除了對 lambda 的全面支持外,還有內(nèi)聯(lián)函數(shù)等簡潔高效的特性。下面我們來仔細看一下2022-12-12AndroidStudio重新share代碼和上傳到svn新地址教程
這篇文章主要介紹了AndroidStudio重新share代碼和上傳到svn新地址教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Android實現(xiàn)自定義驗證碼輸入框效果(實例代碼)
這篇文章主要介紹了Android實現(xiàn)自定義驗證碼輸入框效果,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01Android 虛擬機中的內(nèi)存分配與OOM問題詳解
這篇文章主要為大家介紹了Android 虛擬機中的內(nèi)存分配與OOM問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09記錄Android studio JNI開發(fā)的三種方式(推薦)
JNI (Java Native Interface)是一套編程接口,用來實現(xiàn)Java代碼和其他語言(c、C++或匯編)進行交互。下面通過本文給大家講解Android studio JNI開發(fā)的三種方式,需要的朋友參考下吧2017-12-12Android中發(fā)送Http請求(包括文件上傳、servlet接收)的實例代碼
首先我是寫了個java工程測試發(fā)送post請求:可以包含文本參數(shù)和文件參數(shù)2013-05-05