自定義View筆記(二) 深入理解自定義屬性

2021-08-09 14:08:53 字數 2146 閱讀 3984

注:該筆記是整理學習鴻洋大神自定義view系列部落格的部分知識點。

一、typedarray 與 attributeset 獲取 view 屬性的區別

attributeset獲取方式:

public

mytextview(context context, attributeset attrs)

}

typedarray獲取方式:

public mytextview(context context, attributeset attrs)
當布局檔案這樣設定屬性時:

.example

.test

.mytextview

android:layout_width="@dimen/dp100"

android:layout_height="@dimen/dp200"

zhy:testattr="520"

zhy:text="@string/hello_world" />

輸出的結果為:

mytextview(4692): attrname = layout_width , attrval = @2131165234

mytextview(4692): attrname = layout_height , attrval = @2131165235

***mytextview(4692): attrname = text , attrval = @2131361809

***mytextview(4692): attrname = testattr , attrval = 520

>>use typedarray

***mytextview(4692): text = hello world! , textattr = 520

***

結論:typedarray其實是用來簡化我們的工作的,比如上例,如果布局中的屬性的值是引用型別(比如:@dimen/dp100),如果使用 attributeset 去獲得最終的畫素值,那麼需要第一步拿到 id,第二步再去解析id。而 typedarray 正是幫我們簡化了這個過程。

二、如果系統中已有明確的屬性,能不能在 view 屬性定義時直接使用

解答:

可以直接使用,使用方式:

/** 注意宣告和使用的區別,差別就是有沒有format */

"test">

"android:text" />

"testattr" format="integer" />

在類中這麼獲取:ta.getstring(r.styleable.test_android_text);布局檔案中直接android:text=」@string/hello_world」即可。

三、能不能在 view 屬性定義時,不使用 declare-styleable 標籤

解答:

可以不使用,但是當在類中獲取屬性值時,需要在宣告乙個 int 陣列,用於儲存 attr 的 id,並且我們根據元素的在陣列中的位置,定義了一些整形的常量代表其下標,然後通過typedarray進行獲取。所以建議使用

例如:

attrs.xml

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

name="testattr"

format="integer" />

resources>

mytextview類

public

class

mytextview

extends

view ;

private

static

final

int attr_android_text = 0;

private

static

final

int attr_testattr = 1;

public

mytextview(context context, attributeset attrs)

}

自定義View理解

整合view view流程 onmeasure 在這個方法裡指定自己的寬高 ondraw 繪製自己的內容 整合viewgroup viewgroup流程 onmeasure 指定自己的寬高,所有子view的寬高 onlayout 擺放所有子view ondraw 繪製內容 widthmode mea...

自定義view 二

自定義view的最重要的乙個部分是自定義它的外觀。根據你的程式的需求,通過ondraw方法實現繪製。在ondraw中,會傳遞給你乙個canvas。canvas封裝了繪製圖形的方法。還需要自定義乙個 paint去定義顏色樣式的填充 簡單來說 canvas定義你在螢幕上畫的圖形,而paint定義顏色,樣...

自定義View筆記

1.帶刪除按鈕的listview 將觸控事件交給手勢處理器處理 return gesturedetector.ontouchevent event override public boolean ondown motionevent e return false override public vo...