亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

自定義控件常用方法總結

2019-11-07 23:11:25
字體:
來源:轉載
供稿:網友

inflate

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

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

而View.inflate其實還是調用的LayoutInflater去解析一個xml:

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

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

另外還有帶三個參數的inflate方法:

inflate(int resource, ViewGroup root, boolean attachToRoot)

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

onFinishInflate

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

requestLayout

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

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

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

invalidate

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

postInvalidate

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

setWillNotDraw

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

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

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

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

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默認是會跳過繪制的,也即(mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW會返回一個true,那么會直接走dispatchDraw方法去畫它自己的孩子去了,并不會調用帶一個參數的draw(canvas),但是當這個ViewGroup有背景或者setWillNotDraw(false)時,就會走draw(canvas)方法。所以如果我們自定義一個ViewGroup并且想要實現它本身的繪制的話,就可以給它設置一個背景或者調用setWillNotDraw(false)。

onAttachedToWindow

onAttachedToWindow是當一個View綁定到window上時的調用,根據View類里面的對這個方法的注釋,onAttachedToWindow肯定會在onDraw方法之前調用。在自定義控件里面,我們可以在onAttachedToWindow注冊一些廣播接收器,觀察者或者開啟一些任務,大家可以參考TextClock的里面的實現。

onDetachedFromWindow

onDetachedFromWindow對應于onAttachedToWindow,是當一個View從window上移除時的一個調用。如果在onAttachedWindow里面注冊了一些監聽,那么通常就要在onDetachedFromWindow里面反注冊。

ViewTreeObserver

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

ViewTreeObserver.OnGlobalLayoutListener

當在一個視圖樹中全局布局發生改變或者視圖樹中的某個視圖的可視狀態發生改變的監聽器,一般的使用姿勢是:

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

當一個視圖樹將要繪制時的監聽器,一般的使用姿勢是:

getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {                        @Override            public boolean onPreDraw() {                                //do something before draw                //for example, request a new layout                return true;            }  });
原文地址:http://mp.weixin.QQ.com/s?__biz=MzI0MjE3OTYwMg==&mid=2649548795&idx=1&sn=b7bc070beb02171afa20466d89c36353&chksm=f1180c86c66f8590549cbcf613188eec03a046be240b0a072e58c9aa53b676926711bddb0a68&mpshare=1&scene=23&srcid=0225NqQh4xzCCfY9fbjtts2d#rd
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费小视频| 国产日韩精品入口| 情事1991在线| 欧美激情a∨在线视频播放| 中文字幕日韩av电影| 国产成人久久精品| 成人免费视频在线观看超级碰| 日韩av在线免费| 国产精品亚洲激情| 日本一区二区三区在线播放| 日韩在线欧美在线国产在线| 91精品视频大全| 欧美视频国产精品| 91亚洲精品久久久| 91精品国产自产在线| 欧美一乱一性一交一视频| 国产精品久久久久av免费| 国产精品精品久久久| 欧美丝袜美女中出在线| 国产成人一区二区三区电影| 91在线观看免费高清完整版在线观看| 91免费电影网站| 国产成人一区二区三区电影| 精品久久久久久| 欧美wwwxxxx| 两个人的视频www国产精品| 一个人看的www欧美| 91在线免费视频| 欧美黑人巨大精品一区二区| 不卡伊人av在线播放| 国内精品免费午夜毛片| 国产激情久久久久| 亚洲自拍偷拍在线| 日韩av资源在线播放| 精品国产精品自拍| 国产精品久久久久久亚洲调教| 欧美高清视频一区二区| 国产午夜精品全部视频播放| 国产精品亚洲综合天堂夜夜| 伊人久久大香线蕉av一区二区| 日韩专区在线观看| 久久高清视频免费| 亚洲精品视频在线观看视频| 97激碰免费视频| 在线精品高清中文字幕| 91精品国产高清久久久久久| 国产日本欧美视频| 亚洲欧美中文字幕在线一区| 欧美日韩人人澡狠狠躁视频| 欧美第一淫aaasss性| 欧美肥老太性生活视频| 久久久www成人免费精品张筱雨| 久久五月天色综合| 欧美人与性动交a欧美精品| 欧美激情免费视频| 日韩av日韩在线观看| 77777亚洲午夜久久多人| 午夜欧美不卡精品aaaaa| 国产精品高潮呻吟久久av野狼| 国产自产女人91一区在线观看| 欧美成人午夜激情视频| 欧美中文字幕视频| 8x拔播拔播x8国产精品| 2019中文字幕在线| 亚洲男人的天堂网站| 成人精品在线视频| 成人亚洲综合色就1024| 成人免费观看49www在线观看| 91免费人成网站在线观看18| 久久成人人人人精品欧| 国产一区红桃视频| 91高清免费视频| 国产成人一区二区三区小说| 国产做受高潮69| 国产精品你懂得| 亚洲变态欧美另类捆绑| 日韩美女中文字幕| 欧美性jizz18性欧美| 欧美最猛性xxxxx亚洲精品| 欧美日韩亚洲视频| 亚洲精品日韩久久久| 欧美老女人在线视频| 亚洲精品91美女久久久久久久| 曰本色欧美视频在线| 精品视频www| 2019中文字幕全在线观看| 欧美孕妇毛茸茸xxxx| 91经典在线视频| 日韩av免费网站| 福利视频导航一区| 2025国产精品视频| 日韩免费观看在线观看| 岛国精品视频在线播放| 国产欧美一区二区三区久久人妖| 免费91在线视频| 亚洲一区第一页| 日韩av大片在线| 亚洲护士老师的毛茸茸最新章节| 亚洲欧洲成视频免费观看| 不卡在线观看电视剧完整版| 欧美成人精品h版在线观看| 91精品国产成人| 日韩久久精品成人| 亚洲欧美中文日韩v在线观看| 岛国精品视频在线播放| 国产在线播放不卡| 国产免费一区二区三区在线观看| 久久这里只有精品99| 日韩大胆人体377p| 亚洲成av人乱码色午夜| 97精品免费视频| 国产精品免费一区豆花| 亚洲精品久久久久中文字幕欢迎你| 国产成人鲁鲁免费视频a| 国内外成人免费激情在线视频| 久久精品国产欧美亚洲人人爽| 久热精品视频在线观看一区| 92看片淫黄大片看国产片| 欧美亚洲成人精品| 国产欧美一区二区三区视频| 黄网站色欧美视频| 91午夜在线播放| 亚洲欧美日韩区| 国产免费一区二区三区在线观看| 欧美高清视频在线| 欧美在线性爱视频| 国产精品91视频| 欧美日韩国产黄| 精品国产乱码久久久久久婷婷| 欧美老女人bb| 欧美高清电影在线看| 欧美又大又硬又粗bbbbb| 欧美日韩亚洲成人| 久久香蕉国产线看观看av| 成人精品aaaa网站| 国产精品91在线| 狠狠爱在线视频一区| 一本色道久久综合狠狠躁篇怎么玩| 精品视频久久久久久| 日韩欧美在线免费观看| 91精品视频专区| 欧美精品一区二区免费| 国产激情综合五月久久| 亚洲精品国产欧美| 国产视频精品va久久久久久| 国产精品高潮粉嫩av| 国产成人一区二区三区电影| 久久久久久久久久亚洲| 国产亚洲一级高清| 精品亚洲一区二区三区在线观看| 久久成人精品一区二区三区| 成人av.网址在线网站| 精品国产鲁一鲁一区二区张丽| 国产亚洲人成a一在线v站| 亚洲精品乱码久久久久久金桔影视| 国产精品香蕉av| 亚洲九九九在线观看| 国产免费久久av| 国产aⅴ夜夜欢一区二区三区| www.色综合| 97在线免费观看视频| 九九热精品视频国产| 国产suv精品一区二区三区88区| 国产一区二区色|