电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

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

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

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

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

inflate(int resource, ViewGroup root, boolean attachToRoot)

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

onFinishInflate

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

requestLayout

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

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

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

invalidate

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

postInvalidate

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

setWillNotDraw

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

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

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

注意這里的draw方法是帶三個(gè)參數(shù)的,與我們通常講的帶一個(gè)參數(shù)的draw方法不一樣。在View類中找到帶三個(gè)參數(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); }}

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

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

onAttachedToWindow

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

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

onDetachedFromWindow

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

ViewTreeObserver

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

ViewTreeObserver.OnGlobalLayoutListener

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

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)一個(gè)視圖樹將要繪制時(shí)的監(jiān)聽器,一般的使用姿勢(shì)是:

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)文章:
主站蜘蛛池模板: 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 软文世界-软文推广-软文营销-新闻稿发布-一站式软文自助发稿平台 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 线材成型机,线材折弯机,线材成型机厂家,贝朗自动化设备有限公司1 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 健康管理师报名入口,2025年健康管理师考试时间信息网-网站首页 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 电动葫芦|环链电动葫芦-北京凌鹰名优起重葫芦 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 缠绕机|缠绕膜包装机|缠绕包装机-上海晏陵智能设备有限公司 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 东莞注册公司-代办营业执照-东莞公司注册代理记账-极刻财税 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 企业微信营销_企业微信服务商_私域流量运营_艾客SCRM官网 | 车载加油机品牌_ 柴油加油机厂家| 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 三板富 | 专注于新三板的第一垂直服务平台 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 |