Android-自定义View-onLayout方法

作者: MonkeyLei | 来源:发表于2019-07-12 09:50 被阅读0次

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

    相关文章

      网友评论

        本文标题:Android-自定义View-onLayout方法

        本文链接:https://www.haomeiwen.com/subject/argskctx.html