LayoutInflater、View的绘制流程、自定义View、Invalidate和postInvalidate的区别
来源:互联网 发布:惠泽了知福建版 编辑:程序博客网 时间:2024/04/27 21:50
LayoutInflater主要是用于加载布局,LayoutInflater技术广泛应用于需要动态添加View的时候
首先需要获取到LayoutInflater的实例,有两种方法可以获取到,第一种写法如下:LayoutInflater layoutInflater = LayoutInflater.from(context);
当然,还有另外一种写法也可以完成同样的效果:LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
其实第一种就是第二种的简单写法,只是Android给我们做了一下封装而已
得到了LayoutInflater的实例之后就可以调用它的inflate()方法来加载布局了,如下所示:layoutInflater.inflate(resourceId, root);
inflate()方法一般接收两个参数,第一个参数就是要加载的布局id,第二个参数是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。这样就成功成功创建了一个布局的实例,之后再将它添加到指定的位置就可以显示出来了。
通过LayoutInflater来将button_layout这个布局添加到主布局文件的LinearLayout中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainLayout = (LinearLayout) findViewById(R.id.main_layout);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null);
mainLayout.addView(buttonLayout);
}
参考文章:http://blog.csdn.net/guolin_blog/article/details/16330267
1、mesarue()
主要作用:为整个View树计算实际的大小,即设置实际的高(对应属性:mMeasuredHeight)和宽(对应属性:mMeasureWidth),每个View的控件的实际宽高都是由父视图和本身视图决定的。设置本View视图的最终大小,该功能的实现通过调用setMeasuredDimension()方法去设置实际的高(对应属性: mMeasuredHeight)和宽(对应属性:mMeasureWidth)
2、layout()
会设置该View视图位于父视图的坐标轴,即mLeft,mTop,mLeft,mBottom(调用setFrame()函数去实现)
接下来回调onLayout()方法(如果该View是ViewGroup对象,需要实现该方法,对每个子视图进行布局)
3、draw()绘图过程
在这三个流程中,Google已经帮我们把draw()过程框架已经写好了,自定义的ViewGroup只需要实现measure()过程和layout()过程即可 。
这三种情况,最终会直接或间接调用到三个函数,分别为invalidate(),requsetLaytout()以及requestFocus() ,接着这三个函数最终会调用到ViewRoot中的schedulTraversale()方法,该函数然后发起一个异步消息,消息处理中调用performTraverser()方法对整个View进行遍历
invalidate()方法 :
说明:请求重绘View树,即draw()过程,假如视图发生大小没有变化就不会调用layout()过程,并且只绘制那些“需要重绘的”视图,即谁(View的话,只绘制该View ;ViewGroup,则绘制整个ViewGroup)请求invalidate()方法,就绘制该视图。
一般引起invalidate()操作的函数如下:
1、直接调用invalidate()方法,请求重新draw(),但只会绘制调用者本身。
2、setSelection()方法 :请求重新draw(),但只会绘制调用者本身。
3、setVisibility()方法 : 当View可视状态在INVISIBLE转换VISIBLE时,会间接调用invalidate()方法,继而绘制该View。
4、setEnabled()方法 : 请求重新draw(),但不会重新绘制任何视图包括该调用者本身。
requestLayout()方法 :会导致调用measure()过程 和 layout()过程 。
说明:只是对View树重新布局layout过程包括measure()和layout()过程,不会调用draw()过程,但不会重新绘制任何视图包括该调用者本身。
requestFocus()函数说明:
说明:请求View树的draw()过程,但只绘制“需要重绘”的视图。
参考文章:http://www.uml.org.cn/mobiledev/201211305.asp
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用
http://blog.csdn.net/qinjuning/article/details/7110211
- LayoutInflater、View的绘制流程、自定义View、Invalidate和postInvalidate的区别
- 自定义View时遇到的invalidate 和 postInvalidate的区别
- View中的 postInvalidate 和 invalidate 的区别
- 自定义View-invalidate和postInvalidate
- 详解Android中自定义View的invalidate,Handler和postInvalidate
- 自定义View重绘使requestLayout, invalidate和postInvalidate的异同
- 【android-view】android中Invalidate和postInvalidate的区别
- android中Invalidate和postInvalidate的更新view区别
- (转)Android开发:Invalidate和postInvalidate刷新View的区别
- android view中invalidate和postInvalidate的区别
- android中Invalidate和postInvalidate的更新view区别
- android中Invalidate和postInvalidate的更新view区别
- Android开发:Invalidate和postInvalidate刷新View的区别及应用-----ImageView绘制旋转圆环(二)
- View的绘制和invalidate
- View 中requestLayout 和 invalidate,postinvalidate() 区别
- Android View 绘制流程 与invalidate 和postInvalidate 分析--从源码角度
- View的两种更新方法-从源码角度分析invalidate()和postInvalidate()的区别
- Android之界面刷新 View更新 Invalidate和postInvalidate的区别
- 应届生关于工作的困扰。
- baoj1875 HH去散步 【矩阵转移】
- 【C/C++】概念:指针和引用的区别
- 颜色
- 程序中呼叫Class(类)
- LayoutInflater、View的绘制流程、自定义View、Invalidate和postInvalidate的区别
- [省选前题目整理][BZOJ 1059][ZJOI 2007]矩阵游戏(二分图最大匹配)
- HDFS的重要参数配置<一> JVM的配置
- A8U推一键上面洗车APP软件
- [leetcode]Length of Last Word (求最后一个单词的长度 C语言实现)
- U-Boot启动过程完全分析
- ProtoBuf开发者指南
- 每天linux命令_chmod
- 问题总结