来自官方 View | Android Developers
onLayout
added in API level 1
protected void onLayout (boolean changed,
int left,
int top,
int right,
int bottom)
Called from layout when this view should assign a size and position to each of its children.
Derived classes with children should override this method and call layout on each of their
children.
Parameters
changed boolean: This is a new size or position for this view
left int: Left position, relative to parent
top int: Top position, relative to parent
right int: Right position, relative to parent
bottom int: Bottom position, relative to parent
翻译:View需要给每个它的子控件进行大小和位置设置时都会被调用。派生类的子类应该重写此方法以及调用它们子控件的layout。至于参数看上去还好理解。
Now,这个怎么用呢?什么时候用呢?
1. 我们先重写然后调试看下具体的值:
image由于我们是居中的约束布局,控件本身是200dp(在420dpi,1080*1920的机器上是525px),所以左上角x=(1080 - 525)/2 = 277.5 = 288; 剩下的其实也好算对吧。
**2. **比如我们加上margin...
<me.heyclock.hl.customcopy.MyTextView01
style="@style/MyTextView01"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginLeft="50dp"
android:background="@color/colorPrimary"
app:ccolor="#F50808"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:radius="60dp" />
结果left会多增加50dp, left = 343, 也就是父类帮我们搞定了间距啥的...
image那是在哪里处理的了??其实和之前android:background=....是一样的,就是在构造函数里面做了一些事情,然后由上层进行子控件位置进行布局,包括间距,位置等。我们的单个子控件就是这样被控制了位置,当然作为控件,它的画布里面的内容肯定还是我们自己来绘制的啦...(我目前是这样想的。后面的章节我们会快速进行ViewGroup的自定义,到时候再看看怎么操作子控件的,同时还得进行测量,位置onLayout啥的,到时应该就会更清楚)
按照上面的说法,这里我们的单个控件都不需要重写onLayout去做什么特殊处理的哈!当我们自定义ViewGroup的时候再细细分析:
比如这种:public class LayoutView extends ViewGroup....
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int childCount = getChildCount();//判断是否存在子控件
if(childCount >0){
View childView = getChildAt(0);//获得第一个子控件
//让子控件在屏幕的中点开始填充屏幕
int childWidth = childView.getMeasuredWidth();//主要getMeasuredWidth函数的值必须调用了measureChild才存在值
int childHeigth = childView.getMeasuredHeight();
childView.layout(540,0,childWidth+540,childHeigth);//设置子控件的位置,需要首先获得子控件的大小
}
}
今天先到这里,一口气总结了下自定义View的onMeasure, onLayout,顺便复习完善了下之前的onDraw,初始化等。也进行了些尝试...也算是不太陌生了。以前去拿别人的第三方控件类来的时候,基本上就是上面的内容,不过就是看不懂,哎!
歇一歇,下班去锻炼会。。。。后面继续自定义ViewGroup...(过程中再补自定义相关知识...Touch事件我之前简单搞了下,有更复杂的后面再深入搞...)
网友评论