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ì)小的知識點??梢杂涀∵@五個點,并且了解每個點里包含的小知識點。再加上一些自定義控件的練習(xí)。將這些知識熟練于心,相信開發(fā)者都能夠定義出優(yōu)秀的自定義控件。接下來對上面列出的5個要點進行細(xì)化闡述。
創(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)文章
Android開源項目PullToRefresh下拉刷新功能詳解2
這篇文章主要為大家進一步的介紹了Android開源項目PullToRefresh下拉刷新功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android測量每秒幀數(shù)Frames Per Second (FPS)的方法
這篇文章主要介紹了Android測量每秒幀數(shù)Frames Per Second (FPS)的方法,涉及Android針對多媒體文件屬性操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
Android編程判斷網(wǎng)絡(luò)連接是否可用的方法
這篇文章主要介紹了Android編程判斷網(wǎng)絡(luò)連接是否可用的方法,實例分析了Android判定網(wǎng)絡(luò)連接的相關(guān)技巧與實現(xiàn)步驟,需要的朋友可以參考下2015-12-12
Android使用WebView加載播放視頻流及實現(xiàn)相關(guān)功能
這篇文章主要講解在 Android 應(yīng)用中使用 WebView 加載播放視頻流,包括 WebView 配置、媒體控制器、權(quán)限、安全性、用戶體驗等方面,介紹了實現(xiàn)相關(guān)功能的代碼示例,需要的朋友可以參考下2025-01-01
Android實現(xiàn)注冊頁面(攜帶數(shù)據(jù)包跳轉(zhuǎn))
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)注冊頁面,點擊注冊按鈕跳轉(zhuǎn)到另一個頁面并顯示輸入信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
Android編程之Application設(shè)置全局變量及傳值用法實例分析
這篇文章主要介紹了Android編程之Application設(shè)置全局變量及傳值用法,結(jié)合實例形式較為詳細(xì)的分析了全局變量及傳值的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12
Android控件之AnalogClock與DigitalClock用法實例分析
這篇文章主要介紹了Android控件之AnalogClock與DigitalClock用法,以實例形式分析了Android時鐘控件AnalogClock和DigitalClock用于顯示時間的具體使用技巧,需要的朋友可以參考下2015-09-09

