Android重点知识——View和ViewGroup与自定义控件
作者:丁明祥
一、基础
ViewGroup 参考资料:
Android 手把手教您自定义ViewGroup(一)
View参考资料:
Android 自定义View (一)系列
1.概念
Android中的View包含用户交互和显示,ViewGroup继承自View,主要充当View的容器。
ViewGroup和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接受和处理消息的功能,android系统所产生的消息会在这些ViewGroup和 View之间传递。
2.在自定义控件时继承ViewGroup和View的区别(这个地方上次面试被坑了一把)
测量:onMeasure() 设置自己显示在屏幕上的宽高(自定义View中不一定要用,在ViewGroup中使用到) 布局:onLayout() 设置自己显示在屏幕上的位置(自定义View中一定不实用,只有在自定义ViewGroup中用到) 绘制:onDraw() 在显示屏幕中绘制(自定义View中一定使用到,但自定义Viewgroup时不需要)
自定义ViewGroup:
在onMeasure()中计算childView的测量值以及模式,以及设置自己的宽和高。
解释一下测量模式:
EXACTLY:表示设置了精确的值,一般当childView设置其宽、高为精确值、match_parent时,ViewGroup会将其设置为EXACTLY;
AT_MOST:表示子布局被限制在一个最大值内,一般当childView设置其宽、高为wrap_content时,ViewGroup会将其设置为AT_MOST;
还有一种,没想到在哪儿用,懒得写
在onLayout()中设置childView的绘制区域。
自定义View:
Android 中自定义View的主要步骤:
- 定义View的属性,res/values/attrs.xml,属性值类型包括string,color,demension,integer,enum,reference,float,boolean,fraction,flag。
- 在构造方法中获得定义好的样式属性
- 重写onMeasure(),获得我们自己设置的大小,当我们设置明确的宽度和高度时,系统帮我们测量的结果就是我们设置的结果,当我们设置为WRAP_CONTENT或者MATCH_PARENT,系统帮我们测量的结果就是MATCH_PARENT的长度。
所以,当设置了WRAP_CONTENT时,我们需要自己进行测量,即重写onMesure方法”
- 重写onDraw()将自定义的视图在屏幕上绘制出来。
- 在布局中使用自定义View。
二、深入(这一部分可能还要长期修改,)
3.深入Android中的View和ViewGroup
参考资料:
ViewGroup
Android群英传 第三章
Android中View绘制流程以及invalidate()等相关方法分析
要理解Android中的View和ViewGroup必须要理解,
1)ViewGroup由View继承而来,ViewGroup又是布局文件和View容器的基类
- 在这个类里定义了ViewGroup.LayoutParams类,这个类是布局参数的子类。
2)ViewGroup是作为容器存在的,在该容器中可存放View和ViewGroup。
在我们写Android布局文件的时候,会告诉布局文件(容器)我们的View的宽度,高度,对齐方式,margin等,所以:
- ViewGroup的职能为:给childView计算出建议的宽和高和测量模式 ,决定childView的位置。
- View的职责,根据测量模式和ViewGroup给出的建议的宽和高,计算出自己的宽和高,同时在ViewGroup中绘制。
从API角度来看:
- View的根据ViewGroup传人的测量值和模式,对自己宽高进行确定(onMeasure中完成),然后在onDraw中完成对自己的绘制
- ViewGroup需要给View传入view的测量值和模式(onMeasure中完成),而且对于此ViewGroup的父布局,自己也需要在onMeasure中完成对自己宽和高的确定。此外,需要在onLayout中完成对其childView的位置的指定。
3.1 作为容器的ViewGroup
ViewGroup是一个容器,其采用一个数组来存储这些子View 实现private View[] mChildren;
3.2 ViewGroup中的增删查算法
由于是通过一个数组来存储View数据的,所以对于ViewGroup来说其必须实现增、删、查的算法。
- 增加
- 移除
- 查询