Android 绘制view的小知识点
【onMeasure】
直接继承view或ViewGroup的自定义控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于match_parent。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width=;//根据需求调节默认值大小
int height=;//根据需求调节默认值大小
if(widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST){
setMeasuredDimension(width, height);
}else if(widthMode == MeasureSpec.AT_MOST){
setMeasuredDimension(width, heightSize );
}else if(heightMode == MeasureSpec.AT_MOST){
setMeasuredDimension(widthSize , height);
}
}
//LinearLayout 通过measure调用onMeasure
ViewGroup是一个抽象类,有一个抽象方法onLayout;没有重写onMeasure方法,但是提供了一个measureChildren来对每一个子元素进行measure
ViewGroup的测量过程onMeasure一般都在其子类中重写,比如在LinearLayout中的onMeasure,会先判断线性方向,然后遍历测量(对每个子元素执行
measureChildBeforeLayout()方法,这个方法内部会调用子元素的measure()方法来测量其本身的大小)子元素,子元素测量完毕, LinearLayout会测量自己的大小
setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),heightSizeAndState);
View不是抽象类
在Activity的各个生命周期onCreat,onResume中都可能无法获取View的准确的宽高信息,因为View的measure过程和Activity的生命周期不是同步的。
解决办法:1.在View的onWindowFocusChanged中执行view.getMeasuredWidth()
【onLayout】//LinearLayout 通过layout调用onLayout
layout方法确定View本身的位置,而onLayout遍历子元素(通过setChildFrame)调用子元素的layout方法确定子元素的位置。
【onDraw】
通过draw方法调用下面的四个方法
1.绘制背景background.draw(canvas)。
2.绘制自己onDraw(canvas)。
3.绘制children(dispatchDraw(canvas))。
4.绘制装饰(onDrawScrollBars(canvas))。
View的绘制的传递是通过dispatchDraw来实现的,(在ViewGroup中的)dispatchDraw会遍历所有子元素的draw方法,如此draw事件就可以一层层的传递下去

ViewRoot对应于ViewRootImpl类,它是连接WindowManager和Deco人View(FrameLayout)的纽带。
自定义View须知:
1.让View支持wrap_content;
2.如果必要,让你的View支持padding:这是因为直接继承View的控件,如果不在draw方法中处理paddong,那么padding属性是无法起作用的。另外继承自ViewGroup的控件需要在onMeasure和onLayout中考虑padding和子元素的margin对其造成的影响,不然将导致padding和子元素的margin失效。
3.尽量不要在View中使用handler,没必要,因为View中本身就有post系列的方法,可以替代handler
4.View中如果有线程或动画,需要及时停止,参考View#onDetachedFromWindow。
Android 绘制view的小知识点的更多相关文章
- android绘制view的过程
1 android绘制view的过程简单描述 简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw): 下面看看每一步的动作到底是 ...
- 【转】Android绘制View的过程研究——计算View的大小
Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...
- Android开发之实用小知识点汇总-2
1.EditText 中将光标移到文字末尾: EditText mEdit = (EditText)this.findViewById(R.id.EditText01); mEdit .setText ...
- Android开发之实用小知识点汇总-1
1.去掉android屏幕中的actionbar: this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 //这个是全屏幕显示的代码 ...
- Android 程序申请权限小知识点
在Google Play 应用商店,显示至少支持设备的数量时候会用到权限数量.其他地方用处不大. Android系统提供为程序提供了权限申请,即在manifest中使用uses-permission来 ...
- Android MediaPlayer架构 -- 前言小知识点(一)
在Android中可以使用MediaPlayer+SurfaceView来实现一个简单的多媒体播放器. 一 构造函数 java MediaPlayer class 的源码位置:frameworks\ ...
- Android的Activity的小知识点
1.android的四种启动模式分别是:standard,singleTop,SingleTask,singleInstance. 我们可以在AndroidMainfest.xml中通过Activit ...
- Android MediaPlayer架构 -- 前言小知识点(二)
本文系作者自己学习之所用,文章内容仅出自作者拙劣之思考,问题之处烦请不吝指教. 在frameworks\av\media\libmedia\mediaplayer.cpp中会有语句:const sp& ...
- Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程
转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...
随机推荐
- 如何开发FineReport的自定义控件?
FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论. 第一步:实例化一 ...
- webform:图片水印、验证码制作
一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat=& ...
- 我的MYSQL学习心得(二) 数据类型宽度
我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 那些年黑了你的微软BUG
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 炎炎夏日,朗朗乾坤,30℃ 的北京,你还在 Coding 吗? 整个 7 月都在忙项目,还加了 ...
- [Javascript] 爬虫 模拟新浪微博登陆
概述: 由于业务需要,要编写爬虫代码去爬去新浪微博用户的信息. 虽然在网上能找到不少信息,但由于新浪微博改版,其登陆机制进行了修改,故很多老的文章就不适合用了. 经过一番摸索,成功模拟新浪微博的登陆 ...
- Docker之Compose服务编排
Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景. 说明:Comp ...
- WCF学习之旅—WCF寄宿前的准备(八)
一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类协定的定 ...
- 【兼容写法】HttpServerUtility.Execute 在等待异步操作完成时被阻止。关键词:MVC,分部视图,异步
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html MVC6之前的版本,对分部视图的异步支持不是很好 问题: 视图里面有分布视图:@{ ...
- 07.GitHub实战系列~7.Git之VS2013团队开发(如果不想了解git命令直接学这篇即可)
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
- Git异常:Cannot delete the branch 'test1' which you are currently on
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...