`
xixinfei
  • 浏览: 410868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android的onLayout、layout方法讲解

 
阅读更多

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

 

onLayout方法:

1
2
3
@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方法:

1
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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布局:

1
2
3
4
5
6
7
8
9
10
<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布局。

分享到:
评论

相关推荐

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

    主要为大家详细介绍了android流式布局的onLayout()方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Android 重写ViewGroup 分析onMeasure()和onLayout()方法

    主要介绍了Android 重写ViewGroup 分析onMeasure()和onLayout()方法的相关资料,需要的朋友可以参考下

    ViewGroup用onLayout实现view的自由移动

    NULL 博文链接:https://qq187155685.iteye.com/blog/1442778

    Android下如何理解onMeasure,onLayout的过程

    onLayout在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下。View绘制过程就好比你向银行贷款, 在Android中view如何完成绘制这个过程介绍了很多,但是很多...

    Android 实现滑动方法总结

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

    Android流式布局简单实现

    Android流式布局简单实现,通过继承ViewGroup,重写OnLayout方法,实现标签的流式布局

    customLayout

    自定义layout组合,onLayout,onMeasure,onFinishInflate,onDraw

    博客&lt;FlowLayout详解(一)——onMeasure()与onLayout()&gt;对应源码

    博客《FlowLayout详解(一)——onMeasure()与onLayout()》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/47029169

    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 ...

    自定义view,父容器无限onmeasure、 onlayout

    背景:楼主本人的电脑在某一段时间使用过程中,只要一启动模拟器上我们的APP,电脑散热风扇的声音就加大,...这个自定义view在onDraw方法中,调用了一个很不起眼的方法:setLayoutParams. 将这个方法去掉之后,界面滑动

    Android继承ViewGroup实现Scroll滑动效果的方法示例

    本文实例讲述了Android继承ViewGroup实现Scroll滑动效果的方法。分享给大家供大家参考,具体如下: extends ViewGroup需要重写onMeasure和onLayout方法 onMeasure方法是去测量ViewGroup需要的大小以及包含的子View...

    Android判断软键盘是否弹出

    通过重写onLayout方法,判断软键盘是否弹出。判断到键盘是否弹出后,就可以做自己想做的事情了。

    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实现手势滑动多点触摸放大缩小图片效果

    该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法. setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View,然后刷新进行动态更新UI. 并且...

    Android代码-GuideView

    -- addHintView -- GuideView.onMeasure -- GuideView.onLayout -- GuideView.onDraw 使用 public void onResume() { super.onResume(); fragment.post(new Runnable() { @Override public void run() { ...

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

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

    [开源]Android瀑布流实例_android_waterfall-master

    首先考虑的是这样实现比较简单,代码量不多,简单易懂,不用涉及AdapterView里的一些复杂View显示方法(onMeasure,onLayout等),回收算法也是采用相对简单实用的方式,虽然那个现在还有Bug,就是突然刷新到第一页的...

    自定义相对布局

    这是一个自定义相对布局 里面重写了onSizechange onMearuse onLayout三个方法 这个是自定义控件中常用的需要重写的一些方法 三个方法的执行顺序就是按照上面的顺序执行的 希望初学者能够看下

Global site tag (gtag.js) - Google Analytics