Android知识进阶(遥远的重头开始)

Android-自定义View-onLayout方法

2019-07-12  本文已影响0人  MonkeyLei

来自官方 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事件我之前简单搞了下,有更复杂的后面再深入搞...)

上一篇 下一篇

猜你喜欢

热点阅读