日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android自定義控件常用方法總結(jié)

瀏覽:26日期:2022-09-27 13:21:07
inflate

inflate方法常常用來解析一個xml布局文件,在自定義組合式控件中常常使用,使用的姿勢包括:

View.inflate(context, resource, root)LayoutInflater.from(getContext()).inflate(resource, root);

而View.inflate其實還是調(diào)用的LayoutInflater去解析一個xml:

public static View inflate(Context context, int resource, ViewGroup root) {LayoutInflater factory = LayoutInflater.from(context);return factory.inflate(resource, root); }

所以這兩種姿勢沒啥區(qū)別,這里來討論一下inflate(resouce, root)的返回值,參數(shù)resource是布局資源,root是傳入的一個根節(jié)點。如果root傳入一個null,inflate就會解析resource對應(yīng)的xml,返回這個xml中的根節(jié)點,如果root傳入不為null,inflate會解析這個xml布局并且添加到根節(jié)點root下,然后返回根節(jié)點root。

另外還有帶三個參數(shù)的inflate方法:

inflate(int resource, ViewGroup root, boolean attachToRoot)

這里多了一個參數(shù)attachToRoot,如果root為null,則返回解析后的xml布局中的根節(jié)點;如果root不為null,attachToRoot為true,inflate會解析這個xml布局并且添加到根節(jié)點root下,然后返回根節(jié)點root;如果root不為null,attachToRoot為false,inflate會解析這個xml布局但不會添加到根節(jié)點root下,然后返回解析后的xml布局中的根節(jié)點,這時候root的作用只是為xml中的根節(jié)點提供布局參數(shù)的屬性,因為xml中的根節(jié)點不知道自己的父容器是誰,所以如果沒有人給它提供的話,它的布局參數(shù)就會失效。

onFinishInflate

onFinishInflate是當(dāng)所有的孩子都解析完后的一個調(diào)用。比如我們自定義一個ViewGroup,想要去找到孩子做一些設(shè)置,這時候如果在自定義ViewGroup的構(gòu)造函數(shù)去findViewById的話,會返回一個null,因為此時孩子還沒有解析好,也就是還沒有生出來。這時候我們可以去覆寫onFinishInflate,當(dāng)孩子解析好后再去find。

requestLayout

關(guān)于requestLayout的介紹比較多,requestLayout()方法會觸發(fā)measure過程和layout過程,不會調(diào)用draw過程,也不會重新繪制任何View包括該調(diào)用者本身

onSizeChange(int w, int h, int oldw, int oldh)

onSizeChange是控件的大小發(fā)生變化的時候的調(diào)用,它的調(diào)用軌跡是layout->setFrame->sizeChange->onSizeChange。當(dāng)控件第一次布局時肯定會被調(diào)用到,我們覆寫該方法可以獲取到控件的大小。所以這個方法通常被用來在里面初始化跟控件大小相關(guān)的成員變量。

invalidate

invalidate使用的非常頻繁,它會觸發(fā)View的重新繪制,也就是繪制流程的draw過程,但不會調(diào)用測量和布局過程

postInvalidate

我們都知道Android的UI是單線程模型,只能在主線程更新UI,所以我們只能在主線程調(diào)用invalidate,如果想要在子線程更新ui,可以使用handler發(fā)送一個msg到主線程,然后在處理msg的時候去調(diào)用invalidate。另外,我們可以直接調(diào)用postInvalidate去在子線程更新UI,postInvalidate內(nèi)部實現(xiàn)也是使用handler來做發(fā)送msg到主線程然后調(diào)用invalidate。

setWillNotDraw

自定義ViewGroup通常是不會去繪制自己的,如果大家重寫ViewGroup里面的draw方法或者onDraw方法會發(fā)現(xiàn)它們根本就不會被調(diào)用到。但是如果給你的ViewGroup設(shè)置一個背景,就會發(fā)現(xiàn)draw方法和onDraw方法又都會走了。

我們知道ViewGroup本身是一個View,它的繪制是被其父容器發(fā)起的,具體的位置是在ViewGroup中的drawChild方法:

protected boolean drawChild(Canvas canvas, View child, long drawingTime) {return child.draw(canvas, this, drawingTime); }

注意這里的draw方法是帶三個參數(shù)的,與我們通常講的帶一個參數(shù)的draw方法不一樣。在View類中找到帶三個參數(shù)的draw方法,發(fā)現(xiàn)里面有這么一段代碼:

if (!hasDisplayList) { // Fast path for layouts with no backgrounds if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) {mPrivateFlags &= ~PFLAG_DIRTY_MASK;dispatchDraw(canvas); } else {draw(canvas); }}

從這里我們可以看出一點端倪,通常一個ViewGroup默認(rèn)是會跳過繪制的,也即 (mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW 會返回一個true,那么會直接走dispatchDraw方法去畫它自己的孩子去了,并不會調(diào)用帶一個參數(shù)的 draw(canvas) ,但是當(dāng)這個ViewGroup有背景或者setWillNotDraw(false)是,就會走 draw(canvas) 方法。

所以如果我們自定義一個ViewGroup并且想要實現(xiàn)它本身的繪制的話,就可以給它設(shè)置一個背景或者調(diào)用 setWillNotDraw(false)

onAttachedToWindow

onAttachedToWindow是當(dāng)一個View綁定到window上時的調(diào)用,根據(jù)View類里面的對這個方法的注釋,onAttachedToWindow肯定會在onDraw方法之前調(diào)用。

在自定義控件里面,我們可以在onAttachedToWindow注冊一些廣播接收器,觀察者或者開啟一些任務(wù),大家可以參考TextClock的里面的實現(xiàn)。

onDetachedFromWindow

onDetachedFromWindow對應(yīng)于onAttachedToWindow,是當(dāng)一個View從window上移除時的一個調(diào)用。如果在onAttachedWindow里面注冊了一些監(jiān)聽,那么通常就要在onDetachedFromWindow里面反注冊。

ViewTreeObserver

ViewTreeObserver是視圖樹的觀察者,監(jiān)聽一些視圖樹的全局變化,這些全局變化包括整個視圖樹的布局,開始繪制,觸摸模式的變化等。我們不能直接初始化ViewTreeObserver的對象,需要通過getViewTreeObserver()去獲取。

ViewTreeObserver.OnGlobalLayoutListener

當(dāng)在一個視圖樹中全局布局發(fā)生改變或者視圖樹中的某個視圖的可視狀態(tài)發(fā)生改變的監(jiān)聽器,一般的使用姿勢是:

getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() {getViewTreeObserver().removeGlobalOnLayoutListener(this);//do something you like//for example, get view width or height height }});ViewTreeObserver.OnPreDrawListener

當(dāng)一個視圖樹將要繪制時的監(jiān)聽器,一般的使用姿勢是:

getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { @Override public boolean onPreDraw() {//do something before draw//for example, request a new layoutreturn true; }});

來自:http://www.jianshu.com/p/744550c02cf1

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩国产91| 麻豆91小视频| 蜜桃视频欧美| 日韩一区二区免费看| 国产真实久久| 亚洲午夜久久| 国产精品777777在线播放| 亚洲精品成人图区| 自拍日韩欧美| 日韩av网站免费在线| 久久精品九色| 日韩天堂av| 日本a口亚洲| 国产精品网在线观看| 国产夫妻在线| 91久久在线| 91国内精品| 高清不卡亚洲| 中文字幕av一区二区三区人| 国产精品久久久久久妇女| 亚洲va中文在线播放免费| 久久成人国产| 国产福利亚洲| 国产手机视频一区二区| 欧美日韩91| 欧美日韩在线播放视频| 亚洲欧美网站在线观看| 成人在线视频中文字幕| 免费精品国产的网站免费观看| 亚洲天堂av资源在线观看| 免费在线亚洲欧美| 香蕉久久久久久久av网站| 国产极品久久久久久久久波多结野| 一区二区三区四区日本视频| 在线日韩成人| 999久久久精品国产| 国产三级一区| 亚洲女同一区| 国产一区二区三区久久久久久久久| 国产精品视区| 国产盗摄——sm在线视频| 日韩欧美精品一区二区综合视频| 日本欧美不卡| 奇米狠狠一区二区三区| 亚洲精品91| 国产一区二区三区精品在线观看 | 中文字幕成人| 亚洲黄色免费av| 欧美精品国产白浆久久久久| 免费观看久久av| 国内一区二区三区| 五月激激激综合网色播| 欧美中文一区二区| 精品视频在线观看网站| 日韩一区二区三免费高清在线观看 | 亚洲精品国产偷自在线观看| 久久av免费| 日本天堂一区| 鲁大师成人一区二区三区| 91看片一区| 日本一二区不卡| 青草av.久久免费一区| 91久久亚洲| 久久男女视频| 国产成人调教视频在线观看| 国产精品久久久久久久久久白浆 | 狠狠久久婷婷| 久久精品国产99久久| 成人午夜毛片| 国产精品红桃| 国产三级精品三级在线观看国产| 99国产精品久久久久久久成人热| av最新在线| 黄色网一区二区| 国产精品2区| 久久国产视频网| 日本在线不卡视频| 亚洲97av| 91精品国产自产精品男人的天堂| 亚洲三级精品| 亚洲理论在线| 中文字幕一区二区三区四区久久 | 婷婷综合在线| 九九久久婷婷| 欧美日韩在线网站| 久久国产亚洲| 欧美 日韩 国产精品免费观看| 天堂√8在线中文| 麻豆成人在线观看| 欧美91在线| 精品一区二区男人吃奶 | 麻豆成人综合网| 国产精品17p| 牛牛精品成人免费视频| 麻豆一区二区99久久久久| 欧美激情aⅴ一区二区三区| 欧美亚洲网站| 蜜桃精品视频| 综合日韩av| 亚洲性色视频| 免费欧美在线视频| 亚洲日韩中文字幕一区| 亚州精品视频| 国产精品一区二区精品视频观看 | 九色精品91| 久久成人亚洲| 亚洲精品免费观看| 欧美午夜不卡影院在线观看完整版免费| 国产精品啊v在线| 久久精选视频| 红桃视频欧美| 日韩精品亚洲专区在线观看| 日韩精品a在线观看91| 国产精品久久久久久模特| 欧美黄色精品| 午夜精品久久久久久久久久蜜桃| 国产一区视频在线观看免费| 亚洲免费在线| 人人爱人人干婷婷丁香亚洲| 欧美激情视频一区二区三区在线播放| 精品免费视频| 欧美成人国产| 日韩精品久久久久久| 日本免费新一区视频| 美女久久99| 久久蜜桃av| 婷婷综合一区| 91欧美国产| 中文无码日韩欧| 国产一区二区精品久| 亚洲激情另类| 国产亚洲第一伦理第一区| 波多野结衣久久精品| 最新国产拍偷乱拍精品| 欧美日一区二区三区在线观看国产免 | 老色鬼久久亚洲一区二区| 欧美日韩一区二区三区四区在线观看 | 久久久久九九精品影院| 99久久精品费精品国产| 欧美精品观看| 久久久一二三| 欧美日韩一区自拍| 久久久久国产| 91国内精品| 久久九九精品| 国产欧美日韩一区二区三区四区| 日韩精品91| 国产欧美在线| 亚洲一区二区毛片| 韩国女主播一区二区三区| 亚洲经典在线| 成人一区而且| 欧美一级二级三级视频| 蜜桃视频欧美| 国产a亚洲精品| 天堂va在线高清一区| 国内亚洲精品| 国产精品一区三区在线观看| 91久久在线| 日本在线高清| 国产伦理一区| 午夜欧美精品| 精品久久美女| 日韩和欧美一区二区三区| 香蕉精品久久| 精品国产乱码久久久久久樱花| 六月婷婷一区| 欧美午夜精品一区二区三区电影| 久久中文欧美| 欧美另类中文字幕 | 激情欧美亚洲| 国产中文在线播放| 国产九九精品| 首页欧美精品中文字幕| 久久视频一区| 黑人精品一区| 国产一区二区三区亚洲| 欧美视频久久| 亚洲人成毛片在线播放女女| 午夜国产一区二区| 九九精品调教| 在线一区av| 四季av一区二区凹凸精品| 免费在线播放第一区高清av| 日韩高清二区| 亚洲欧美久久精品| 免费看精品久久片| 久久高清一区| 午夜一级久久| 午夜久久黄色| av亚洲在线观看| 91精品一区国产高清在线gif| 国产一区二区三区不卡视频网站| 国产精品黄色片| 久久一区精品| 国产一区二区三区黄网站 | 久久精品国产久精国产| 欧美国产另类| 里番精品3d一二三区| 国产视频一区二|