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

您的位置:首頁技術文章
文章詳情頁

Android自定義控件常用方法總結

瀏覽:24日期:2022-09-27 13:21:07
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 layoutreturn true; }});

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

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精东传媒成人av电影| 欧美在线资源| 久久国产高清| 鲁大师影院一区二区三区| 国产亚洲在线| 麻豆久久精品| 亚洲欧美激情诱惑| 亚洲激情黄色| 日韩网站在线| 免费在线观看一区二区三区| 亚洲制服一区| 久久国产婷婷国产香蕉| 国产亚洲一卡2卡3卡4卡新区| 日本欧美一区二区| 亚洲ab电影| 国产日韩一区二区三区在线 | 免费看久久久| 色婷婷色综合| 亚洲大全视频| 免费久久99精品国产| 欧美亚洲三区| 国产成人精选| 伊人精品视频| 欧美一区久久| 国产日韩电影| 亚洲综合不卡| 国产麻豆一区二区三区| 久久男人天堂| 免费人成在线不卡| 欧美黑人做爰爽爽爽| 国内精品亚洲| 精品在线播放| 欧美一级一区| av日韩中文| 日韩中文字幕1| 国产精品色在线网站| 最新中文字幕在线播放| 亚洲免费一区二区| 免费在线播放第一区高清av| 秋霞影视一区二区三区| 中文字幕日韩高清在线| 精品国产不卡| 亚洲色诱最新| 国产精品一区高清| 久久亚洲国产| 日韩精品一级| 亚洲h色精品| 日本欧美韩国一区三区| 久久青青视频| 亚洲精品乱码| 久久裸体视频| 欧美一区二区三区久久| 欧美 日韩 国产精品免费观看| 日本亚州欧洲精品不卡| 天堂中文在线播放| 男女性色大片免费观看一区二区| 国产一区调教| 婷婷综合电影| 久久精品在线| 国产精品久久乐| 视频一区中文| 久久久久亚洲精品中文字幕| 亚洲作爱视频| 久久精品国产网站| 伊人国产精品| 日韩在线欧美| 欧美日本三区| 久久国产高清| 欧美gv在线| 久久国产婷婷国产香蕉| 久久视频精品| 精品淫伦v久久水蜜桃| 99视频+国产日韩欧美| 久久中文在线| 日韩高清在线一区| 成人精品中文字幕| 国产乱人伦精品一区| 丝袜a∨在线一区二区三区不卡| 亚洲天堂av影院| 国产精品66| 日韩有吗在线观看| 美女毛片一区二区三区四区 | 国产精品一区毛片| 久久国产成人| 99成人在线视频| 久久中文字幕一区二区三区| 亚洲精品第一| 老司机久久99久久精品播放免费| 色在线视频观看| 青草国产精品| 中文字幕av一区二区三区人| 亚洲国产一区二区在线观看| 日韩黄色大片网站| 久久久久久自在自线| 国产精品tv| 国产探花在线精品一区二区| 日本成人在线视频网站| 亚洲无线观看| 男人的天堂亚洲一区| 一区二区自拍| 亚洲福利免费| 久久亚洲国产| 深夜视频一区二区| 欧美gv在线| 精品一区二区三区在线观看视频 | 精品91福利视频| 麻豆精品久久| 美女精品视频在线| 国产福利一区二区三区在线播放| 久久激情五月婷婷| 日本午夜精品视频在线观看| 亚洲2区在线| 天堂va欧美ⅴa亚洲va一国产| 久久亚洲精品伦理| 亚洲中午字幕| 首页国产欧美日韩丝袜| 玖玖玖国产精品| 国产精品7m凸凹视频分类| 日韩在线中文| 性欧美videohd高精| 黑森林国产精品av| 在线手机中文字幕| 在线手机中文字幕| 最新中文字幕在线播放| 黄毛片在线观看| 日韩欧美综合| 久久香蕉国产| 日韩视频在线一区二区三区 | 性欧美69xoxoxoxo| 午夜精品免费| 午夜在线一区二区| 亚洲天堂免费| 日韩高清电影免费| 国产精品三级| 精品国产不卡| 色一区二区三区| 不卡在线一区二区| 亚洲在线观看| 日韩福利视频一区| 精品网站999| 国产精品福利在线观看播放| 欧美www视频在线观看| 91av亚洲| 中文精品视频| 欧美日韩1区2区3区| 老司机精品在线| 日韩网站中文字幕| 免费的成人av| 国产精品久久国产愉拍| 新版的欧美在线视频| jiujiure精品视频播放| 亚洲视频二区| 国产精品激情电影| 亚洲成人av观看| 蜜桃一区二区三区在线| 日韩动漫一区| 精品深夜福利视频| 激情视频一区二区三区| 日韩专区欧美专区| 国产精品亚洲四区在线观看| 极品av在线| 亚洲我射av| 国内精品亚洲| 久久亚洲一区| 麻豆精品少妇| 在线视频日韩| 国产精品色婷婷在线观看| 青青青免费在线视频| 免费人成精品欧美精品| 欧美激情99| 亚洲高清激情| 日韩精品欧美大片| 日韩三区在线| 青青草精品视频| 91精品精品| 国产亚洲精品美女久久| 99精品在线免费在线观看| 日韩精品一页| 欧美日韩中文字幕一区二区三区| 中文字幕亚洲影视| 一本大道色婷婷在线| 日本不卡高清视频| 久久天堂精品| 欧美专区一区| 欧美1区免费| 国产精品mm| 亚洲欧美一区在线| 国产麻豆一区二区三区| 五月婷婷六月综合| 久久精品国产福利| 在线一区二区三区视频| 9999国产精品| 青草国产精品久久久久久| 亚洲二区在线| 国产精品777777在线播放| 一区二区自拍| 黄色欧美在线| 欧美午夜三级| 蜜臀a∨国产成人精品| 999久久久精品国产|