Android自定義控制項

2021-10-10 17:02:39 字數 4133 閱讀 7342

在android中,無論是熟知的布局,還是控制項,統統全都繼承自基類view。

自定義view實現有幾種:

① 自定義組合控制項:多個控制項組合成為乙個新的控制項,方便多處復用② 繼承系統view控制項:繼承自textview等系統控制項,在系統控制項的基礎功能上進行擴充套件③ 繼承view:不復用系統控制項邏輯,繼承view進行功能定義④ 繼承系統viewgroup:繼承自linearlayout等系統控制項,在系統控制項的基礎功能上進行擴充套件⑤ 繼承viewgroup:不復用系統控制項邏輯,繼承viewgroup進行功能定義

一、view的繪製流程

view的繪製基本由measure()、layout()、draw()這個三個函式完成:

measure:測量view的寬高,主要是view中的:measure(),setmeasureddimension(),onmeasure()方法。layout:計算當前view以及子view的位置,主要是view中的:layout(),onlayout(),setframe()方法。draw:檢視的繪製工作,主要是view中的:draw(方法。

二、android 螢幕座標系

在android座標系中,以螢幕左上角作為原點,這個原點向右是x軸的正軸,向下是y軸正軸。

gettop:view到其父布局頂邊的距離getleft:到其父布局左邊的距離getbottom:view到其父布局頂邊的距離getright:view到其父布局左邊的距離

結合以上的api,可以計算出檢視的寬度和高度,可以使用如下方式計算:

width = getright - getleft;height = getbottom - gettop

三、自定義view開發的步驟

這裡我們介紹最複雜的一種,自定義view。

3.1 建構函式

無論是繼承系統view還是直接繼承view,都需要對建構函式進行重寫,建構函式有多個,至少要重寫其中乙個才行。

public class customview extends view{

public customview(context context){

super(context);

public customview(context context, attributeset attrs

super(context, attrs);

//更多引數的建構函式

3.2 自定義屬性

android系統的控制項以android開頭的都是系統自帶的屬性。為了方便配置自定義view的屬性,我們也可以自定義屬性值。android自定義屬性可分為以下幾步:

1、自定義乙個view2、編寫values/attrs.xml,在其中編寫styleable和item等標籤元素3、在布局檔案中view使用自定義的屬性(注意namespace在view的構造方法中通過typedarray獲取

attrs.xml檔案示例如下:

<?xml version="1.0" encoding="utf-8"?>

**實現示例如下:

public class mytextview extends view {

private static final string tag = mytextview.class.get******name();

//在view的構造方法中通過typedarray獲取

public mytextview(context context, attributeset attrs {

super(context, attrs);

typedarray ta = context.obtainstyledattributes(attrs, r.styleable.test);

string text = ta.getstring(r.styleable.test_testattr);

int textattr = ta.getinteger(r.styleable.test_text, -1);

log.e(tag, "text = " + text + " , textattr = " + textattr);

ta.recycle();

布局檔案使用示例如下:

xmlns:tools=「

android:layout_width=「match_parent」

android:layout_height=「match_parent」 >

android:layout_width=「100dp

android:layout_height=「200dp」

四、measure()

measurespec

measurespec是view的內部類,它封裝了乙個view的尺寸,在onmeasure()當中會根據這個measurespec的值來確定view的寬高。measurespec的值儲存在乙個int值當中。乙個int值有32位,前兩位表示模式mode後30位表示大小size。即measurespec = mode + size。

在measurespec當中一共存在三種mode:

unspecified:無限制,view對尺寸沒有任何限制,view設定為多大就應當為多大。exactly :精準模式,view需要乙個精確值,這個值即為measurespec當中的size。對應的是match_parent。at_most:最大模式,view的尺寸有乙個最大值,view不可以超過measurespec當中的size值。對應的是wrap_content。

常見的使用方式如下:

// 獲取測量模式(mode)

int specmode = measurespec.getmode(measurespec)

// 獲取測量大小(size)

int specsize = measurespec.getsize(measurespec)

// 通過mode 和 size 生成新的specmode

int measurespec=measurespec.makemeasurespec(size, mode);

onmeasure

整個測量過程的入口位於view的measure方法當中,該方法做了一些引數的初始化之後呼叫了onmeasure方法,這裡我們主要分析onmeasure。onmeasure原始碼如下:

protected void onmeasure widthmeasurespec, int heightmeasurespec) {

setmeasureddimension(getdefaultsize(getsuggestedminimumwidth(), widthmeasurespec),

getdefaultsize(getsuggestedminimumheight(), heightmeasurespec));

setmeasureddimension(int measuredwidth, int measuredheight) :該方法用來設定view的寬高,在我們自定義view時也會經常用到。getdefaultsize(int size, int measurespec):該方法用來獲取view預設的寬高。getsuggestedminimumwidth():getheight和該方法原理是一樣的

五、layout()

layout()過程,對於view來說用來計算view的位置引數,對於viewgroup來說,除了要測量自身位置,還需要測量子view的位置。layout()方法是整個layout()流程的入口,並在layout方法中呼叫了onlayout方法,主要是進行子view的計算。

六、draw()

draw流程也就是的view繪製到螢幕上的過程,整個流程的入口在view的draw()方法之中,而原始碼注釋也寫的很明白,整個過程可以分為6個步驟:

繪製背景有過有必要,儲存當前canvas繪製view的內容繪製子view根據需要,繪製邊緣、陰影等效果繪製裝飾,如滾動條等等

七、總結

自定義view在android的開發中的重要性還是很大的,因為僅僅靠系統提供的控制項和元件,無論是美觀度還是使用度,再或者是新特性上,都無法滿足特定的業務場景。因此,常常要用到自定義view,這就要求要在自己的專案自己完成特殊控制項的自主開發。自定義控制項在開發過程中也屬於重點和難點,應該多花時間進行學習和研究,重點有以下幾個:

控制項屬性的定義、設定和使用互動處理:事件互動和處理屬於重中之重,常常要和事件分發結合在一起研究。canvas和paint:在進行自定義view開發時,往往會通過畫布自己使用畫筆進行繪製,這就要求要對paint、path、canvas要做著重的掌握。

Android 自定義控制項

幹android也有一段的時間了,自定義這塊的東西覺得還是很有比較複習一下基礎的東西。自定義控制項和自定義元件基本上的使用都是在專案中基本的android控制項滿足不了需求的時候使用的。所以,如果要高出特別炫的特效,或者比較特殊的控制項排列方式,例如瀑布流,那麼就要好好學學自定義咯。首先,先簡單的介...

android自定義控制項

android自定義控制項 二 入門,繼承view 說說android 兩種為自定義元件新增屬性的使用方法和區別 自定義控制項的屬性 自定義控制項 今天花了3,4個小時看了自定義控制項,看 懂了,還沒有實踐,因為時間不夠,日後實踐。總結下 自定義控制項有3種方式 繼承已有控制項 繼承乙個容器控制項,...

Android自定義控制項

android學習筆記,整理給自己複習的時候看的,謝謝!1.自定義開關 1.宣告介面物件 public inte ce onswitchstateupdatelistener 2.新增設定介面物件的方法,外部進行呼叫 public void setonswitchstateupdatelistene...