简介ViewGroup

来源:互联网 发布:三国无双7帝国捏脸数据 编辑:程序博客网 时间:2024/06/02 03:02

ViewGroup是一种特别的View,它可以作为一个视图组件的容器,从而在里面添加其他的视图组件。这是它的相关继承关系:

从这图片中,我们就不会感到陌生了。


继承GroupView时,onLayout()是必须重写的。

其中很重要的三个方法是:onMeasure(),onLayout(),ondispatchDraw()。

他们分别执行组件的测量,位置和绘制,执行顺序:

子组件的个数不为0,当添加子组件的时候会引起容器的状态发生变化。从而子组件的大小和位置就需要重新测量,所以会调用多次。


下面我们做个小实例:

public class MyViewGroup extends ViewGroup {public MyViewGroup(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public MyViewGroup(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public MyViewGroup(Context context) {super(context);// TODO Auto-generated constructor stub// ImageView mButton = new ImageView(context);// mButton.setBackgroundColor(Color.GREEN);// addView(mButton);}/** * 设置组件的大小 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 获取该ViewGroup的实际长和宽 涉及到MeasureSpec类的使用int specSize_Widht = MeasureSpec.getSize(widthMeasureSpec);int specSize_Heigth = MeasureSpec.getSize(heightMeasureSpec);// 设置本ViewGroup的宽高setMeasuredDimension(specSize_Widht, specSize_Heigth);}/** * 设置组件的位置 */@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubView view = null;// 获取在onMeasure中计算的视图尺寸int lastTop = 0;int height = 10;// l:左边距 t:上边距 r:与左边距的差值为宽 b:与上边距的差值为高(默认分别为满屏 ,为: 0:0:480:724)for (int index = 0; index < getChildCount(); index++) {view = getChildAt(index);lastTop += index * 50;// 所以 高度就50(lastTop+50 -lastTop)view.layout(l, lastTop, r, lastTop + 50);}}/** * 绘制组件 */@Overrideprotected void dispatchDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.dispatchDraw(canvas);}}

活动界面添加两个ImageView:

@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);MyViewGroup group = new MyViewGroup(this);group.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));ImageView imgA = new ImageView(this);imgA.setBackgroundColor(Color.CYAN);group.addView(imgA);ImageView imgB = new ImageView(this);imgB.setBackgroundColor(Color.BLUE);group.addView(imgB);setContentView(group);}

结果:





0 0
原创粉丝点击