自定義View學(xué)習(xí)--定義View流程和注意事項(xiàng)

參考了Google官方培訓(xùn)課程鴻洋大神的博客,下面進(jìn)入正題


Googl官方建議

·遵守Android標(biāo)準(zhǔn)規(guī)則吨些。
·提供自定義的風(fēng)格屬性值并能夠被Android XML Layout所識(shí)別
·發(fā)出可訪(fǎng)問(wèn)的事件搓谆。
·能夠兼容Android的不同平臺(tái)。

常用實(shí)現(xiàn)2種方式

·繼承View
·拓展現(xiàn)有控件(繼承系統(tǒng)提供的UI組件)

自定義View的流程

1.繼承View或者繼承View的一個(gè)實(shí)現(xiàn)類(lèi)

  • 至少重寫(xiě)父類(lèi)的一個(gè)構(gòu)造方法
    它包含一個(gè)Contenx與一個(gè)AttributeSet對(duì)象作為參數(shù)豪墅。這個(gè)constructor允許layout editor創(chuàng)建并編輯你的view的實(shí)例泉手。
    public RoundImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    getAttrs(context,attrs);
    }

2.定義自定義屬性

  • Gogle官方建議:
    ·為你的view在資源標(biāo)簽下定義自設(shè)的屬性
    ·在你的XML layout中指定屬性值
    ·在運(yùn)行時(shí)獲取屬性值
    ·把獲取的屬性值應(yīng)用到你的view上

  • 如何定義?
    在vuales文件夾下新建attrs.xml文件偶器,定義自定義View需要的屬性斩萌,可以通過(guò)構(gòu)造方法的 atts參數(shù)獲取
    <resources>
    <declare-styleable name="RoundImageView">
    <attr name="XfermodeImageView_src" format="reference"/>
    <attr name="XfermodeImageView_type" format="integer"/>
    <attr name="XfermodeImageView_borderRadius" format="dimension"/>
    </declare-styleable>
    </resources>

  • 如何使用缝裤?
    在使用自定義的屬性時(shí)要聲明相應(yīng)的命名空間:

      <com.wenjie.drawview.RoundImageView
             xmlns:custom="http://schemas.android.com/apk/res-auto"      
             android:layout_width="match_parent"             
             android:layout_height="wrap_content"   
             custom:XfermodeImageView_src="@mipmap/test2" 
      />
    

請(qǐng)注意:如果你的view是一個(gè)inner class,你必須指定這個(gè)view的outer class.同樣的,如果PieChart有一個(gè)inner class叫做PieView颊郎。為了使用這個(gè)類(lèi)中自設(shè)的屬性憋飞,你應(yīng)該使用com.example.customviews.charting.PieChart$PieView.

  • 如何獲取屬性并且應(yīng)用?

    對(duì)res目錄里的每一個(gè)<declare-styleable>資源姆吭,自動(dòng)生成的R.java文件定義了存放屬性ID的數(shù)組和常量榛做,常量用來(lái)索引數(shù)組中每個(gè)屬性。因此我們可以使用TypedArray這個(gè)類(lèi)來(lái)讀取屬性:(為了方便内狸,下面的代碼比較簡(jiǎn)單)
    public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.getTheme().obtainStyledAttributes(
    attrs,
    R.styleable.CustomView,
    0, 0);
    try {
    mShowText =a.getBoolean(R.styleable.CustomView_showText, false);
    mTextPos = a.getInteger(R.styleable.CustomView_labelPosition, 0);
    } finally {
    a.recycle();
    }
    }

TypedArray對(duì)象是一個(gè)共享資源检眯,必須被在使用后進(jìn)行回收。

  • 添加屬性和事件
    public boolean isShowText() {
    return mShowText;
    }

    public void setShowText(boolean showText) {
        mShowText = showText;
        invalidate();
        requestLayout();
    }
    

注意點(diǎn):在setShowText方法里面有調(diào)用invalidate()) and requestLayout()). 這兩個(gè)調(diào)用是確保穩(wěn)定運(yùn)行的關(guān)鍵答倡。當(dāng)view的某些內(nèi)容發(fā)生變化的時(shí)候轰传,需要調(diào)invalidate來(lái)通知系統(tǒng)對(duì)這個(gè)view進(jìn)行redraw,當(dāng)某些元素變化會(huì)引起組件大小變化時(shí)瘪撇,需要調(diào)用requestLayout方法获茬。調(diào)用時(shí)若忘了這兩個(gè)方法,將會(huì)導(dǎo)致hard-to-find bugs倔既。

  • 響應(yīng)事件的監(jiān)聽(tīng)器
    如果需要額外的事件恕曲,可以通過(guò)接口回調(diào)的方式來(lái)設(shè)置事件監(jiān)聽(tīng),一般可以定義一個(gè)內(nèi)部接口.

3.需要warp_content屬性時(shí):在onMeasure()方法中判斷測(cè)量模式為AT_MOST時(shí)渤涌,設(shè)定一個(gè)值佩谣。


4.實(shí)現(xiàn)onDraw()方法:在這里繪制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市实蓬,隨后出現(xiàn)的幾起案子茸俭,更是在濱河造成了極大的恐慌,老刑警劉巖安皱,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件调鬓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酌伊,警方通過(guò)查閱死者的電腦和手機(jī)腾窝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)居砖,“玉大人虹脯,你說(shuō)我怎么就攤上這事∽嗪颍” “怎么了循集?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鼻由。 經(jīng)常有香客問(wèn)我暇榴,道長(zhǎng)厚棵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任蔼紧,我火速辦了婚禮婆硬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奸例。我一直安慰自己彬犯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布查吊。 她就那樣靜靜地躺著谐区,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逻卖。 梳的紋絲不亂的頭發(fā)上宋列,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音评也,去河邊找鬼炼杖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盗迟,可吹牛的內(nèi)容都是我干的坤邪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼罚缕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艇纺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起邮弹,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黔衡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后腌乡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體员帮,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年导饲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氯材。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渣锦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氢哮,到底是詐尸還是另有隱情袋毙,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布冗尤,位于F島的核電站听盖,受9級(jí)特大地震影響胀溺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皆看,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一仓坞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腰吟,春花似錦无埃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至灵疮,卻和暖如春织阅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背震捣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工荔棉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伍派。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓江耀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親诉植。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祥国,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容