自定义View(二)简单的viewgroup

简介: 上篇讲了自定义View的简单实现,这章就趁热打铁,讲讲自定义ViewGroup的简单实现。一、初探和上篇一样,看看ViewGroup的绘制是什么走的。

<h6>上篇讲了自定义View的简单实现,这章就趁热打铁,讲讲自定义ViewGroup的简单实现。</h6>
<h4>一、初探</h4>
和上篇一样,看看ViewGroup的绘制是什么走的。

img_911d98b1c5862920709d760d33894006.png
image.png

首先可以看到所有的测量和绘制都是在activity的生命周期走之后再走,然后先进行viewgroup的onMeasure,在进行子View的。因为在父viewgroup的onMeasure中写了
measureChildren(widthMeasureSpec, heightMeasureSpec);
如果不加这段代码,则不会出现子View。详细的原理还是先不说,但是从这两个例子你可以知道,写在xml中的view由系统调用完生命周期之后再去绘制,而子View是由父View进行绘制的。

<b>生命周期——父View测量——子view测量——父View摆放子View——绘画父view ——绘画子view</b>
</br>
<h4>二、onMeasure和onLayout</h4>这里就不多讲onDraw了,上一章讲了,套路都一样。
</br>
<h6>1、onMeasure</h6>
onMeasure中需要加measureChildren(widthMeasureSpec, heightMeasureSpec);才能通知子View测量绘画。如果你做出来,你会发现子View的布局会受父布局的影响。所以这个方法里有个需要注意的地方,如果你的viewgroup是打算写死宽高或者match_parent,那当你的子View是固定尺寸时,超过父容器的那部分不会显示。而如果父布局是wrap_content,那最好测量所以子View的尺寸再设置viewgroup的尺寸,这样才能实现wrap_content的效果。
<b>那么这里就说说如何计算子View的尺寸</b>
View child = this.getChildAt(i);
int cw = child.getMeasuredWidth();
这两行代码就能获取到一个子View的尺寸,加个循环就能获取到所以子View的尺寸。
<pre>
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.v("yet","爹的onMeasure");
measureChildren(widthMeasureSpec, heightMeasureSpec);
int childCount = getChildCount();
int h = 0;
if (childCount != 0) {
for (int i = 0; i < childCount; i++) {
View child = this.getChildAt(i);
this.measureChild(child, widthMeasureSpec, heightMeasureSpec);
if(h< child.getMeasuredHeight()){
h = child.getMeasuredHeight();
}
}
}
setMeasuredDimension(500,h);
}
</pre>
我这里做了个例子,viewgroup的宽度为子view的最大宽度,这样viewgroup就能实现一个wrap_content的效果。
</br>
<h6>2、onLayout</h6>
这个方法有五个参数,算是挺多的了,先说下入参的含义。
changed 该参数指出当前ViewGroup的尺寸或者位置是否发生了改变;left,top,right,bottom 当前ViewGroup相对于其父控件的坐标位置。这个方法的作用简单来说就是摆放view。这里就不举例子了,写法很多,网上也有很多例子。

<b>总结:这章就讲了自定义viewgroup的onMeasure和onLayout简单用法。</b>

目录
相关文章
|
容器
自定义View
自定义View 画一个实心圆 效果图 创建attrs.xml文件 初始化样式属性 支持Padding属性 支持wrap_content属性 布局文件中的应用 画一个带外圆环的圆 效果图 创建attrs.xml文件 初始化样式属性 内圆与外圆环的绘制 布局文件中的应用 画一个外圆环可根据数值变动的圆 效果图 创建attrs.xml文件 初始化样式属性 绘制View 提供方法修改样式 布局文件中的应用
105 0
自定义View
|
前端开发
自定义View -简单的 SwitchView
前言 实现一个简单的滑动开发,效果图如下: switchView完整版本 分析 平分整个View为两份 平分VIew 测量字体的高度和宽度,确定左右View的文字的位置并进行绘制 确定字体的位置和绘制 绘制...
1029 0
|
前端开发 Android开发
3.6 自定义View (3.6.1)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget Android给我们提供了丰富的组件库来创建丰富的UI效果,同时也提供了非常方便的拓展方法。
735 0
|
XML Android开发 数据格式
3.6 自定义View (3.6.2)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget 3.6.2 创建复合控件 创建复合控件可以很好地创建出具有重用功能的控件集合。
658 0
|
Android开发
自定义View解决滑动冲突
最近在读Android开发艺术探索,本文作为自己对view的滑动冲突的理解和实践记录 而滑动冲突,需要了解Android的事件分发机制,如果这个还有些疑惑的地方,请参考这篇文章,以及其中的参考文章 还需要View的Measure和Layout的相关知识View的Measure流程总结 自定义view注意 1.
1083 0
|
XML 数据格式
自定义View(一)
一、初探 大家都知道自定义view需要重写onMeasure和onDraw两个方法,这里我们在讲这两个方法前首先看看什么时候走这两个方法,这里只是大致讲讲方便理解,详细的之后会说。
750 0