`

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自定义Layout布局

    本篇文章将深入探讨如何在Android中进行自定义Layout布局的开发。 首先,创建自定义Layout首先要创建一个新的Java类,继承自`ViewGroup`或`LinearLayout`等现有布局。选择`ViewGroup`是因为它是所有布局的基础类,...

    Android FloatLayout的简单使用.zip

    在Android开发中,FloatLayout可能是一个自定义布局,它扩展了Android的基础布局系统,提供了更灵活的元素定位方式。这个压缩包"Android FloatLayout的简单使用.zip"包含了关于如何使用FloatLayout的相关资料,让...

    Android自定义View以及Layout属性

    通过阅读LinearLayout或RelativeLayout的源码,可以学习它们如何遍历并定位子View,这有助于自定义Layout时参考和借鉴。 此外,利用工具如Android Studio的Layout Inspector可以直观地查看运行时布局的层级结构和...

    ViewGroup用onLayout实现view的自由移动

    通过学习和理解`ViewGroup`的`onLayout()`方法,开发者可以自定义布局行为,实现各种创新的界面交互效果。这不仅需要对Android布局机制有深入理解,还需要熟练运用`源码`和相关`工具`进行调试和优化。在实际开发中,...

    dynamicLayout_android源码_

    在Android开发中,动态加载布局(Dynamic Layout)是一种常见的需求,它允许应用程序在运行时根据用户行为或特定条件改变UI布局。Android系统提供了一些机制来实现这种灵活性,其中包括使用LayoutInflater、ViewStub...

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

    Android 重写ViewGroup 中onMeasure()和onLayout()方法详解 Android 中的 ViewGroup 是一个抽象类,继承自 View,提供了基本的布局管理功能。为了提供更好的自定义布局,需要重写 ViewGroup 中的两个重要方法:...

    android自定义实现比例缩放的layout

    标题中的"android自定义实现比例缩放的layout"指的是创建一个自定义的Android布局类,它能够根据不同的屏幕尺寸和密度自动调整其子视图的大小,以保持内容的比例一致。这样的布局有助于确保用户在大屏或小屏设备上都...

    Android自定义控件之自定义组合控件(三)

    oid:layout_height="45dp" android:background="@color/green"&gt; &lt;Button android:id="@+id/title_bar_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_...

    Android 自定义控件 EditText输入框两边加减按钮Button Demo

    接下来,我们需要创建一个自定义View类,继承自ViewGroup,并重写onLayout()方法以正确地布置子视图。同时,我们需要监听两个Button的点击事件,以处理数值的增加和减少: ```java public class AddAndSubtractView...

    android layout布局分析与优化

    2. **Layout**:代表onLayout方法的执行情况。 3. **Draw**:代表onDraw方法的执行情况。 颜色的不同代表着性能的差异: - **绿色**:表示该View的该项性能优于该View Tree中超过50%的View。 - **黄色**:表示该...

    android自定义圆形布局CircleLayout

    `CircleLayout`的核心在于重写`onLayout()`方法,此方法负责确定每个子视图的位置。在`onLayout()`中,我们需要计算出每个子视图相对于中心点的坐标,以实现圆形排列。 ```java public class CircleLayout extends ...

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

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

    Android-ImageNice9Layout仿Nice首页图片列表9图样式并实现拖拽效果

    开发者需要了解如何创建自定义View类,继承自ViewGroup,并重写onMeasure()、onLayout()和onTouchEvent()等方法来控制布局和触摸事件处理。 3. **图片加载库**: 为了加载网络图片,项目可能使用了如Glide、...

    android 开发 滚动logo

    在onLayout()方法中处理子视图的位置,然后在onDraw()方法中绘制滚动效果。 5. 注意事项:在实际开发中,需要考虑性能和用户体验。确保滚动流畅,避免过度绘制,同时考虑不同设备的屏幕尺寸和方向。 综上所述,...

    Android Layout UI 首页加载过渡动画,星期变化动画.zip

    - **自定义ViewGroup**:如果需要更定制化的动画效果,可以通过继承`ViewGroup`并重写其`onLayout()`和`onDraw()`方法,实现自定义的绘制逻辑,配合`postInvalidate()`触发重绘以实现动画效果。 - **使用Lottie**...

    Android自定义标签选择器TagView

    在这个类中,我们需要重写`onMeasure()`和`onLayout()`方法来确定每个子View的位置。同时,我们需要为添加、删除和选择标签提供接口。 ```java public class TagView extends ViewGroup { private List&lt;TagItem&gt; ...

    ex07_layout.rar_android

    本示例“ex07_layout.rar”提供了Android应用中使用不同类型的Layout进行编程和方法的实例演示。通过这个压缩包,开发者可以深入理解如何有效地管理UI元素并创建动态、响应式的用户界面。 1. **线性布局...

    自定义layout

    在Android开发中,自定义`Layout`是一种常见的需求,它能帮助我们实现独特且复杂的界面设计,超越系统预设的视图容器。本教程将详细讲解如何在Android中创建一个自定义的`ViewGroup`,实现等分格子布局,即`...

    android 自动换行layout

    标题提到的“android 自动换行layout”是指一种能够根据屏幕宽度自动将子视图换行显示的LinearLayout实现。这种功能通常用于创建网格或列表,例如商品展示、菜单选项等场景。下面我们将详细探讨如何自定义一个自动...

    view-measrue/layout学习

    `view-measrue/layout学习`的主题涵盖了Android UI系统的基础知识,主要包括以下几个方面: 1. **View**: Android中的View是最基本的UI元素,它可以是按钮、文本框、图片等。每个View都有自己的绘制和事件处理能力...

Global site tag (gtag.js) - Google Analytics