`
xixinfei
  • 浏览: 414558 次
  • 性别: 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布局。

分享到:
评论

相关推荐

    自定义layout

    本教程将详细讲解如何在Android中创建一个自定义的`ViewGroup`,实现等分格子布局,即`MyGridLayoutDemo`。 一、自定义`ViewGroup`基础 1. 创建`MyGridLayout`类:继承自`ViewGroup`,这是所有布局的基础。`...

    android ListView初级到高级详解

    这通常通过重写`AbsListView`的`onLayout()`方法或者使用第三方库实现。 总结,Android中的ListView是一个功能强大且灵活的组件,能够处理各种类型的数据展示和交互。通过理解并熟练掌握上述知识,开发者可以创建出...

    Android实现View排列自动换行

    本篇文章将详细讲解如何在Android中实现这样的功能。 首先,我们要创建一个自定义的布局容器类,这个类通常会继承自`LinearLayout`或`RelativeLayout`。在这个例子中,我们选择`LinearLayout`,因为它的水平和垂直...

    customLayout

    本篇文章将深入探讨如何实现自定义`Layout`,并着重讲解`onLayout`、`onMeasure`、`onFinishInflate`以及`onDraw`这四个关键方法。 首先,我们创建一个自定义`Layout`类,它需要继承自`ViewGroup`或其子类,例如`...

    android TextView水平滚动和垂直滚动效果

    另一种方法是通过重写onMeasure()、onLayout()和computeScroll()方法,配合Scroller类来实现自定义的垂直滚动。这个方法相对复杂,需要对Android视图绘制机制有深入了解。 在压缩包中的示例代码可能包含上述两种...

    Android使用addView动态添加组件

    - 调用 `addView()` 后,视图不会立即绘制,直到当前 `ViewGroup` 的 `onLayout()` 方法被调用。 - 在主线程中进行视图操作,避免出现 ANR(应用无响应)错误。 - 对于大量动态生成的视图,考虑使用 `RecyclerView` ...

    android GridView实现横向滑动

    我们可以创建一个自定义的ViewGroup,继承自GridView并重写onMeasure()和onLayout()方法,使它在水平方向上测量和布局子视图。这种方法需要更多的代码量,但是可以实现更定制化的功能。 3. **使用RecyclerView**:...

    安卓Android源码——android平台仿pinterest瀑布流展现方式实现.rar

    本压缩包提供的"安卓Android源码——android平台仿pinterest瀑布流展现方式实现.rar",旨在帮助开发者理解和实践这种布局的实现方法。以下是关于这一主题的详细知识讲解。 首先,我们需要了解瀑布流布局的基本原理...

    android 实现简单侧滑效果

    本篇文章将详细讲解如何在Android中实现一个基本的侧滑布局,即SlidingLayout。 首先,我们需要了解Android中的布局体系。在Android中,我们主要使用LinearLayout、RelativeLayout、FrameLayout等基本布局,以及...

    通过Fragment+TabHost实现选项卡 顶部

    android:layout_width="match_parent" android:layout_height="match_parent"&gt; android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"&gt; android:...

    Android 自定义控件

    本文将深入讲解如何进行Android自定义控件的开发,包括理解View的工作原理、创建自定义控件的几种方式以及如何为自定义控件添加属性。 首先,我们需要理解View的基本结构和工作原理。Android的视图系统采用组合模式...

    安卓Android源码——(可视区域).zip

    本压缩包文件"安卓Android源码——(可视区域).zip"可能包含了一系列关于Android UI系统如何处理可视区域的源代码、示例和讲解资料,旨在帮助开发者深入理解这一主题。 1. **Android UI系统基础**:Android的UI构建...

    安卓Gallery照片墙画廊图库相关-androidGallery图片滚动.rar

    你可以为`Gallery`设置`android:id`,`android:layout_width`和`android:layout_height`属性,以及其它布局属性如`android:padding`等。 2. **数据绑定**: `Gallery`通常与一个适配器(如`ArrayAdapter`或`...

    Android UI基础教程pdf

    这通常涉及到继承现有的布局类,并重写其onMeasure()和onLayout()方法,实现自己的布局逻辑。 3. **样式和主题**:Android支持全局样式和主题,可以通过定义在res/values/styles.xml文件中的标签来实现。这种方式...

    Android自定义头部view

    本教程将深入讲解如何在Android中实现动态更改头部视图的功能,以满足不同场景下的交互需求。 首先,我们需要了解Android布局的基础知识。布局是Android界面设计的核心元素,用于组织和控制屏幕上的各个组件。...

    Android 折叠布局

    这通常通过自定义ViewGroup来完成,自定义ViewGroup需要重写onLayout()方法以确定子视图的位置,以及onDraw()方法来绘制折叠效果。同时,可能还需要结合动画框架如ObjectAnimator或者ValueAnimator来创建平滑的过渡...

    android汽车仪表view

    通过继承`View`或`ViewGroup`类,并重写其关键方法,如`onDraw()`、`onMeasure()`和`onLayout()`,我们可以构建自己的视图逻辑和渲染效果。在这个案例中,开发者可能创建了一个名为`CarDashboardView`的新类,继承自...

    Android轮播控件

    本教程将深入讲解如何在Android中实现炫酷且简单的轮播控件。 一、轮播控件的基本概念 轮播控件,也称为滑动图片展示器,它允许用户通过滑动或自动切换来浏览多张图片或视图。在Android中,我们可以使用现成的库,...

    Android 自定义充电

    - 使用View的测量(onMeasure())和布局(onLayout())方法来正确确定自定义视图的尺寸和位置。 8. **测试与调试**: - 在真实设备或模拟器上进行测试,确保动画流畅且没有内存泄漏。 - 使用Android Studio的...

Global site tag (gtag.js) - Google Analytics