`

android onLayout、layout方法学习

 
阅读更多
onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置。放置子View很简单,只需在重写onLayout方法,然后获取子View的实例,调用子View的layout方法实现布局。在实际开发中,一般要配合onMeasure测量方法一起使用。

@Override
protected abstract void onLayout(boolean changed,
            int l, int t, int r, int b);

参数的含义如下图:



该方法在ViewGroup中定义是抽象函数,继承该类必须实现onLayout方法,而ViewGroup的onMeasure并非必须重写的。View的放置都是根据一个矩形空间放置的,onLayout传下来的l,t,r,b分别是放置父控件的矩形可用空间(除去margin和padding的空间)的左上角的left、top以及右下角right、bottom值。

layout方法:
public void layout(int l, int t, int r, int b);


该方法是View的放置方法,在View类实现。调用该方法需要传入放置View的矩形空间左上角left、top值和右下角right、bottom值。这四个值是相对于父控件而言的。例如传入的是(10, 10, 100, 100),则该View在距离父控件的左上角位置(10, 10)处显示,显示的大小是宽高是90(参数r,b是相对左上角的),这有点像绝对布局。

平常开发所用到RelativeLayout、LinearLayout、FrameLayout...这些都是继承ViewGroup的布局。这些布局的实现都是通过都实现ViewGroup的onLayout方法,只是实现方法不一样而已。

下面是一个自定义ViewGroup的Demo,用onLayout和layout实现子View的水平放置,间隔是20px

public class MyViewGroup extends ViewGroup {
 
    // 子View的水平间隔
    private final static int padding = 20;
     
    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }
 
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub
         
        // 动态获取子View实例
        for (int i = 0, size = getChildCount(); i < size; i++) {
            View view = getChildAt(i);
            // 放置子View,宽高都是100
            view.layout(l, t, l + 100, t + 100);
            l += 100 + padding;
        }
         
    }
     
}


Activity的XML布局:

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp">
 
    <com.example.layout.myviewgroup android:layout_width="match_parent" android:layout_height="100dp" android:background="#0000ff">
         
        <view android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff0000">
        <view android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ff00">
         
    </view></view></com.example.layout.myviewgroup>
 
</relativelayout>


效果如图所示:




上图MyViewGroup是蓝色,两个子View分别为红色和绿色。

在自定义View中,onLayout配合onMeasure方法一起使用,可以实现自定义View的复杂布局。自定义View首先调用onMeasure进行测量,然后调用onLayout方法,动态获取子View和子View的测量大小,然后进行layout布局。





  • 大小: 36.6 KB
  • 大小: 22.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    android流式布局onLayout()方法详解

    在这里就用简单的流式布局来介绍一下onLayout()方法。 在onLayout方法中有四个参数,我画了一个简单的图来分清楚值哪里。   好啦,现在就直接看代码吧。 FlowLayout.Java  package com.example.my_view; ...

    Android 实现滑动方法总结

    1.1 用Layout方法  我们知道,当view在绘制时会调用onlayout方法来设置显示位置。同样也可以通过view的left、top, right,buttom 四个属性来控制view的坐标。每次在ontouchevent的时候,我们都要获取一下触摸点的...

    Android代码-probe

    Dissect layout traversals on Android. Features Intercept View methods. onMeasure(int, int) onLayout(boolean, int, int, int, int) draw(Canvas) and onDraw(Canvas) requestLayout() Override any of ...

    Android酷炫转动菜单

    protected void onLayout(boolean changed, int l, int t, int r, int b) { int layoutWidth = r - l; int layoutHeight = b - t; int layoutRadius = Math.max(layoutWidth, layoutHeight); // Laying...

    Android实现手势滑动多点触摸放大缩小图片效果

    onLayout方法:是一个回调方法.该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法. setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View...

    Android-Android可自动换行的布局--AutoWrapLineLayout

    首先需要继承ViewGroup, 在这里我们需要重写它的onMeasure和onLayout方法。本项目中它的子View有两种填充方式,一种是Fill_PARENT,一种是WRAP_CONTENT,看名字应该能知道是什么意思吧。

    Android重写Gallery

    //Gallery构造方法 public MyGallery(Activity context) { super(context); // 增加选择指示灯 indicatorView = new ArrayList(); indicatorView.add(context.findViewById(R.id.switcher1)); ...

    Android 自定义控件详解及实例代码

    开发自定义控件的步骤: 1、了解View的工作原理 ...基本操作由三个函数完成:measure()、layout()、draw(),其内部又分别包含了onMeasure()、onLayout()、onDraw()三个子方法。具体操作如下: 1、measure操作  

    三联生活周刊应用布局效果.zip

    这个是三联生活周刊应用布局效果的源码,android自定义viewgroup实现等分格子布局,实现这样的效果:一般的思路就是,直接写布局文件,用LinearLayout 嵌套多层子LinearLayout,然后根据权重layout_weight可以达到上面...

    三联生活周刊应用布局效果

    这个是三联生活周刊应用布局效果的源码,android自定义viewgroup实现等分格子布局,实现这样的效果:一般的思路就是,直接写布局文件,用LinearLayout 嵌套多层子LinearLayout,然后根据权重layout_weight可以达到上面...

    Android中使用自定义ViewGroup的总结

    分类 自定义Layout可以分为两种情况。 自定义ViewGroup,创造出一些不同于LinearLayout,RelativeLayout等之类的ViewGroup。比如:API 14以后增加...自定义View的流程是:onMeasure()-&gt;onLayout()-&gt;onDraw()。自定义V

    ViewPager 放大缩小左右移动

    * through its first layout there will be a smooth animated transition * between the current item and the specified item. * * @param item * Item index to select */ public void ...

    react-native-text-size:在布置文本之前准确测量文本并从您的应用中获取字体信息

    在布置文本之前准确地测量文本并从您的应用程序(Android和iOS)获取字体信息。 主要有两个功能: flatHeights用于同时获取不同文本块的高度,并针对或组件进行了优化。 另一个是measure ,它获取有关一个文本块...

Global site tag (gtag.js) - Google Analytics