自定义View和ViewGroup常用方法执行顺序
来源:互联网 发布:php cms管理系统 编辑:程序博客网 时间:2024/05/16 15:24
1. 自定义View常用方法执行顺序
1.创建MyView继承View
public class MyView extends View { public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); Log.d("MyView", "MyView(2): "); } @Override protected void onFinishInflate() { Log.d("MyView", "onFinishInflate: "); super.onFinishInflate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Log.d("MyView", "onMeasure: "); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onDraw(Canvas canvas) { Log.d("MyView", "onDraw: "); super.onDraw(canvas); } @Override protected void dispatchDraw(Canvas canvas) { Log.d("MyView", "dispatchDraw: "); super.dispatchDraw(canvas); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { Log.d("MyView", "onLayout: "); super.onLayout(changed, left, top, right, bottom); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Log.d("MyView", "onSizeChanged: "); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onAttachedToWindow() { Log.d("MyView", "onAttachedToWindow: "); super.onAttachedToWindow(); } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { Log.d("MyView", "onWindowFocusChanged: "); super.onWindowFocusChanged(hasWindowFocus); }}
2.xml文件中使用
<com.wgheng.test.MyView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dp" android:layout_height="100dp"></com.wgheng.test.MyViewGroup>
3.Log输出情况
06-30 08:19:44.487 11310-11310/com.wgheng.text D/MyView: MyView(2): 06-30 08:19:44.487 11310-11310/com.wgheng.text D/MyView: onFinishInflate: 06-30 08:19:44.540 11310-11310/com.wgheng.text D/MyView: onAttachedToWindow: 06-30 08:19:44.553 11310-11310/com.wgheng.text D/MyView: onMeasure: 06-30 08:19:44.673 11310-11310/com.wgheng.text D/MyView: onMeasure: 06-30 08:19:44.673 11310-11310/com.wgheng.text D/MyView: onSizeChanged: 06-30 08:19:44.673 11310-11310/com.wgheng.text D/MyView: onLayout: 06-30 08:19:44.704 11310-11310/com.wgheng.text D/MyView: onWindowFocusChanged: 06-30 08:19:44.706 11310-11310/com.wgheng.text D/MyView: onMeasure: 06-30 08:19:44.706 11310-11310/com.wgheng.text D/MyView: onLayout: 06-30 08:19:44.707 11310-11310/com.wgheng.text D/MyView: onDraw: 06-30 08:19:44.707 11310-11310/com.wgheng.text D/MyView: dispatchDraw:
从日志中可以看到onWindowFocusChanged()执行时View已经完成了初步的Layout。
Activity生命周期执行的过程中获得或失去焦点时会回调同名的方法,在此同名方法中又回调了View的onWindowFocusChanged()方法,因此比较适合在Activity的onWindowFocusChanged()方法中获取视图的宽和高。
如果在Activity其他方法中获取View的宽和高,很有可能View还未初始化完毕,获得的值为0。
2. 自定义ViewGroup常用方法执行顺序
1.自定义MyViewGroup继承ViewGroup(简单起见继承LinearLayout测试)
public class MyViewGroup extends LinearLayout { public MyViewGroup(Context context, AttributeSet attrs) { super(context, attrs); Log.d("MyViewGroup", "MyViewGroup(2): "); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Log.d("MyViewGroup", "onMeasure: "); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { Log.d("MyViewGroup", "onLayout: "); super.onLayout(changed, l, t, r, b); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Log.d("MyViewGroup", "onSizeChanged: "); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { Log.d("MyViewGroup", "onDraw: "); super.onDraw(canvas); } @Override protected void dispatchDraw(Canvas canvas) { Log.d("MyViewGroup", "dispatchDraw: "); super.dispatchDraw(canvas); } @Override protected void onFinishInflate() { Log.d("MyViewGroup", "onFinishInflate: "); super.onFinishInflate(); } @Override protected void onAttachedToWindow() { Log.d("MyViewGroup", "onAttachedToWindow: "); super.onAttachedToWindow(); } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { Log.d("MyViewGroup", "onWindowFocusChanged: "); super.onWindowFocusChanged(hasWindowFocus); }}
2.xml文件中使用
1> 未设置背景
<com.wgheng.test.MyViewGroup xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dp" android:layout_height="100dp"></com.wgheng.test.MyViewGroup>
1> 设置背景
<com.wgheng.test.MyViewGroup xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dp" android:layout_height="100dp" android:background="#000000"></com.wgheng.test.MyViewGroup>
3.Log输出情况
1> 未设置背景输出情况
06-30 08:20:52.594 12349-12349/com.wgheng.text D/MyViewGroup: MyViewGroup(2): 06-30 08:20:52.594 12349-12349/com.wgheng.text D/MyViewGroup: onFinishInflate: 06-30 08:20:52.639 12349-12349/com.wgheng.text D/MyViewGroup: onAttachedToWindow: 06-30 08:20:52.644 12349-12349/com.wgheng.text D/MyViewGroup: onMeasure: 06-30 08:20:52.736 12349-12349/com.wgheng.text D/MyViewGroup: onMeasure: 06-30 08:20:52.736 12349-12349/com.wgheng.text D/MyViewGroup: onSizeChanged: 06-30 08:20:52.738 12349-12349/com.wgheng.text D/MyViewGroup: onLayout: 06-30 08:20:52.763 12349-12349/com.wgheng.text D/MyViewGroup: onWindowFocusChanged: 06-30 08:20:52.765 12349-12349/com.wgheng.text D/MyViewGroup: onMeasure: 06-30 08:20:52.765 12349-12349/com.wgheng.text D/MyViewGroup: onLayout: 06-30 08:20:52.766 12349-12349/com.wgheng.text D/MyViewGroup: dispatchDraw:
2> 设置背景输出情况
06-30 08:30:51.470 21347-21347/com.wgheng.test D/MyViewGroup: MyViewGroup(2): 06-30 08:30:51.470 21347-21347/com.wgheng.test D/MyViewGroup: onFinishInflate: 06-30 08:30:51.541 21347-21347/com.wgheng.test D/MyViewGroup: onAttachedToWindow: 06-30 08:30:51.557 21347-21347/com.wgheng.test D/MyViewGroup: onMeasure: 06-30 08:30:51.675 21347-21347/com.wgheng.test D/MyViewGroup: onMeasure: 06-30 08:30:51.675 21347-21347/com.wgheng.test D/MyViewGroup: onSizeChanged: 06-30 08:30:51.675 21347-21347/com.wgheng.test D/MyViewGroup: onLayout: 06-30 08:30:51.776 21347-21347/com.wgheng.test D/MyViewGroup: onWindowFocusChanged: 06-30 08:30:51.779 21347-21347/com.wgheng.test D/MyViewGroup: onMeasure: 06-30 08:30:51.779 21347-21347/com.wgheng.test D/MyViewGroup: onLayout: 06-30 08:30:51.779 21347-21347/com.wgheng.test D/MyViewGroup: onDraw: //绘制背景时回调了onDraw()06-30 08:30:51.779 21347-21347/com.wgheng.test D/MyViewGroup: dispatchDraw:
Log中可以看到ViewGroup方法执行顺序和View唯一的差别在于,当ViewGroup绘制背景时会调用onDraw()方法,不绘制背景时就跳过onDraw()方法,执行dispatchDraw()方法
3. ViewGroup嵌套View时方法的执行顺序
1.xml文件中使用
<com.wgheng.test.MyViewGroup xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dp" android:layout_height="100dp" android:background="#000000"> <com.wgheng.test.MyView android:layout_width="100dp" android:layout_height="100dp" /></com.wgheng.test.MyViewGroup>
2.Log输出情况
06-30 10:20:16.872 8869-8869/com.wgheng.test D/MyViewGroup: MyViewGroup(2): 06-30 10:20:16.888 8869-8869/com.wgheng.test D/MyView: MyView(2): 06-30 10:20:16.890 8869-8869/com.wgheng.test D/MyView: onFinishInflate: 06-30 10:20:16.890 8869-8869/com.wgheng.test D/MyViewGroup: onFinishInflate: 06-30 10:20:16.973 8869-8869/com.wgheng.test D/MyViewGroup: onAttachedToWindow: 06-30 10:20:16.973 8869-8869/com.wgheng.test D/MyView: onAttachedToWindow: 06-30 10:20:16.976 8869-8869/com.wgheng.test D/MyViewGroup: onMeasure: 06-30 10:20:16.976 8869-8869/com.wgheng.test D/MyView: onMeasure: 06-30 10:20:17.078 8869-8869/com.wgheng.test D/MyViewGroup: onMeasure: 06-30 10:20:17.078 8869-8869/com.wgheng.test D/MyView: onMeasure: 06-30 10:20:17.078 8869-8869/com.wgheng.test D/MyViewGroup: onSizeChanged: 06-30 10:20:17.078 8869-8869/com.wgheng.test D/MyViewGroup: onLayout: 06-30 10:20:17.078 8869-8869/com.wgheng.test D/MyView: onSizeChanged: 06-30 10:20:17.078 8869-8869/com.wgheng.test D/MyView: onLayout: 06-30 10:20:17.103 8869-8869/com.wgheng.test D/MyViewGroup: onWindowFocusChanged: 06-30 10:20:17.103 8869-8869/com.wgheng.test D/MyView: onWindowFocusChanged: 06-30 10:20:17.107 8869-8869/com.wgheng.test D/MyViewGroup: onMeasure: 06-30 10:20:17.107 8869-8869/com.wgheng.test D/MyView: onMeasure: 06-30 10:20:17.107 8869-8869/com.wgheng.test D/MyViewGroup: onLayout: 06-30 10:20:17.107 8869-8869/com.wgheng.test D/MyView: onLayout: 06-30 10:20:17.108 8869-8869/com.wgheng.test D/MyViewGroup: onDraw: //仅当ViewGroup绘制背景时才执行06-30 10:20:17.108 8869-8869/com.wgheng.test D/MyViewGroup: dispatchDraw: 06-30 10:20:17.108 8869-8869/com.wgheng.test D/MyView: onDraw: 06-30 10:20:17.108 8869-8869/com.wgheng.test D/MyView: dispatchDraw:
这个…看起来略乱,哈哈,就不总结了!
阅读全文
0 0
- 自定义View和ViewGroup常用方法执行顺序
- View和ViewGroup常用方法
- ViewGroup自定义View方法
- 自定义View和ViewGroup
- 自定义View和ViewGroup
- ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明
- ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明
- ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明
- Android 自定义View 和 ViewGroup
- Android 自定义View和ViewGroup
- Android自定义View和ViewGroup
- android自定义viewGroup常用方法
- View和ViewGroup方法解析
- 对比自定义view和自定义viewgroup
- 自定义view,viewgroup的onMeasure 方法
- 自定义View绘制心得(自定义view和自定义viewGroup)
- 【Android 应用开发】自定义View 和 ViewGroup
- Android控件:自定义View和ViewGroup相关
- spring json视图的处理【针对password这种隐藏属性返回】
- Linux下svn服务器搭建
- 设计模式
- C++学习:双向链表List(集合)
- AJAX POST&跨域 解决方案
- 自定义View和ViewGroup常用方法执行顺序
- zabbix 监控jvm
- 友盟统计的使用
- Cocos2d-x游戏开发贪吃蛇小游戏(1)环境的搭建
- 常见的几种最优化方法
- NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南
- 纳税服务系统【自动受理,Quartz任务调度】
- 带重复元素排列
- 解决onActivityResult方法不执行的办法