自定義控制項學習第一課

2021-06-28 20:46:46 字數 2802 閱讀 4144

android中的自定義控制項是成為中高階程式設計師必須去克服的乙個課題。學好自定義控制項,需要你對view繪製的原理,觸控手勢的處理,動畫的運用等基礎重要的知識點有較為深刻的認識和見解。

本人打算認真系統的學習下自定義控制項,學習資料來自於大牛「鴻洋」(我用重新實現其中的例項,並把自己碰到的問題疑問和大家分享。進入正題:

lesson 1:

第一步:

先定義自定義控制項的屬性(當然不是所有自定義控制項都需要定義自己的屬性)

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

name="titletext"

format="string" />

name="titlecolor"

format="color" />

name="titlesize"

format="dimension" />

name="customtitleview">

name="titletext" />

name="titlecolor" />

name="titlesize" />

declare-styleable>

resources>

第二步:

繼承view,重寫onmeasure,ondraw這個方法,其中onmeasure主要是做了測量控制項需要的大小的工作,ondraw就是繪製view的工作,當然還需要解析自定義的一些屬性

public

class

customtitleview

extends

view

/*** 預設的布局檔案呼叫的是兩個引數的構造方法

* *@param context

*@param attrs

*/public

customtitleview(context context, attributeset attrs)

/*** 在三個引數的構造中獲得自定義屬性

* *@param context

*@param attrs

*@param defstyle

*/public

customtitleview(context context, attributeset attrs, int defstyle)

}a.recycle();// 釋放屬性

// 初始化畫筆

mpaint = new paint();

mpaint.settextsize(mtitlesize);

/*** 獲得繪製文字的寬和高

*/mbound = new rect();

mpaint.gettextbounds(mtitletext, 0, mtitletext.length(), mbound);

}@override

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec) else

if(heightmode == measurespec.exactly)else

setmeasureddimension(width, height);

}@override

protected

void

ondraw(canvas canvas)

}

重寫onmeasure先要了解的知識點:

了解measurespec的specmode,一共三種型別:

exactly:一般是設定了明確的值或者是match_parent

at_most:表示子布局限制在乙個最大值內,一般為warp_content

unspecified:表示子布局想要多大就多大,很少使用

學習時還遇到乙個小疑問:

getwidth()和getmeasuredwidth()這兩個方法有什麼區別呢?從字面上看getmeasuredwidth()是測量的寬度,getwidth()就是寬度,所以一般情況下兩者是相同的,比如本例中就是相同的,但是也有一些不一樣的情況,比如一些可以滾動的檢視,getmeasuredwidth()往往比getwidth()要大。

總結:

getwidth(): view在設定好布局後整個view的寬度。

getmeasuredwidth(): 對view上的內容進行測量後得到的view內容佔據的寬度,前提是你必須在父布局的onlayout()方法或者此view的ondraw()方法裡呼叫measure(0,0);(measure中的引數的值你自己可以定義),否則你得到的結果和getwidth()得到的結果是一樣的。

第三步:

在布局檔案中運用:

""

xmlns:tools=""

android:layout_width="match_parent"

android:layout_height="match_parent"

.loubf

.customview

.customtitleview

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:padding="10dp"

android:layout_centerinparent="true"

>

com.loubf

.customview

.customtitleview>

這樣乙個簡單的自定義控制項就算完成了

機器學習第一課

過擬合就是,通過訓練集進行訓練的時候,模型學習了太多的背景雜訊,讓模型的複雜度高於了真實模型 比如看到齒距型的葉子,就覺得不是葉子 欠擬合是指,模型在訓練集上進行學習的時候,效果就不是很好,沒有充分學習到其中的資訊量,複雜度低於真實模型,得到的模型泛化能力差 比如看到綠色,就覺得是葉子 模型評估指標...

python學習第一課

1.單行注釋 2.或 多行注釋運算子的型別運算子的優先順序運算子tips 參考變數型別 算術運算子 print 1 1 2,加 print 2 1 1,減 print 3 4 12,乘 print 3 4 0.75,除 print 3 4 0,整除 地板除 print 3 4 3,取餘 print ...

學習Appium第一課

腦子不用確實是會生鏽的,三年沒有去學習。我差點忘了自己曾經是計算機專業畢業的,配置個chromedrive花了半天,細思極恐。說說自己入的坑吧。簡單到不能簡單的步驟。2 將該路徑新增到系統環境變數path下 認識到這個問題後重新安裝了32位瀏覽器,沒有重啟 ps 可能出現下圖兩種問題,這是chrom...