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中创建一个自定义的`ViewGroup`,实现等分格子布局,即`MyGridLayoutDemo`。 一、自定义`ViewGroup`基础 1. 创建`MyGridLayout`类:继承自`ViewGroup`,这是所有布局的基础。`...
这通常通过重写`AbsListView`的`onLayout()`方法或者使用第三方库实现。 总结,Android中的ListView是一个功能强大且灵活的组件,能够处理各种类型的数据展示和交互。通过理解并熟练掌握上述知识,开发者可以创建出...
本篇文章将详细讲解如何在Android中实现这样的功能。 首先,我们要创建一个自定义的布局容器类,这个类通常会继承自`LinearLayout`或`RelativeLayout`。在这个例子中,我们选择`LinearLayout`,因为它的水平和垂直...
本篇文章将深入探讨如何实现自定义`Layout`,并着重讲解`onLayout`、`onMeasure`、`onFinishInflate`以及`onDraw`这四个关键方法。 首先,我们创建一个自定义`Layout`类,它需要继承自`ViewGroup`或其子类,例如`...
另一种方法是通过重写onMeasure()、onLayout()和computeScroll()方法,配合Scroller类来实现自定义的垂直滚动。这个方法相对复杂,需要对Android视图绘制机制有深入了解。 在压缩包中的示例代码可能包含上述两种...
- 调用 `addView()` 后,视图不会立即绘制,直到当前 `ViewGroup` 的 `onLayout()` 方法被调用。 - 在主线程中进行视图操作,避免出现 ANR(应用无响应)错误。 - 对于大量动态生成的视图,考虑使用 `RecyclerView` ...
我们可以创建一个自定义的ViewGroup,继承自GridView并重写onMeasure()和onLayout()方法,使它在水平方向上测量和布局子视图。这种方法需要更多的代码量,但是可以实现更定制化的功能。 3. **使用RecyclerView**:...
本压缩包提供的"安卓Android源码——android平台仿pinterest瀑布流展现方式实现.rar",旨在帮助开发者理解和实践这种布局的实现方法。以下是关于这一主题的详细知识讲解。 首先,我们需要了解瀑布流布局的基本原理...
本篇文章将详细讲解如何在Android中实现一个基本的侧滑布局,即SlidingLayout。 首先,我们需要了解Android中的布局体系。在Android中,我们主要使用LinearLayout、RelativeLayout、FrameLayout等基本布局,以及...
android:layout_width="match_parent" android:layout_height="match_parent"> android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> android:...
本文将深入讲解如何进行Android自定义控件的开发,包括理解View的工作原理、创建自定义控件的几种方式以及如何为自定义控件添加属性。 首先,我们需要理解View的基本结构和工作原理。Android的视图系统采用组合模式...
本压缩包文件"安卓Android源码——(可视区域).zip"可能包含了一系列关于Android UI系统如何处理可视区域的源代码、示例和讲解资料,旨在帮助开发者深入理解这一主题。 1. **Android UI系统基础**:Android的UI构建...
你可以为`Gallery`设置`android:id`,`android:layout_width`和`android:layout_height`属性,以及其它布局属性如`android:padding`等。 2. **数据绑定**: `Gallery`通常与一个适配器(如`ArrayAdapter`或`...
这通常涉及到继承现有的布局类,并重写其onMeasure()和onLayout()方法,实现自己的布局逻辑。 3. **样式和主题**:Android支持全局样式和主题,可以通过定义在res/values/styles.xml文件中的标签来实现。这种方式...
本教程将深入讲解如何在Android中实现动态更改头部视图的功能,以满足不同场景下的交互需求。 首先,我们需要了解Android布局的基础知识。布局是Android界面设计的核心元素,用于组织和控制屏幕上的各个组件。...
这通常通过自定义ViewGroup来完成,自定义ViewGroup需要重写onLayout()方法以确定子视图的位置,以及onDraw()方法来绘制折叠效果。同时,可能还需要结合动画框架如ObjectAnimator或者ValueAnimator来创建平滑的过渡...
通过继承`View`或`ViewGroup`类,并重写其关键方法,如`onDraw()`、`onMeasure()`和`onLayout()`,我们可以构建自己的视图逻辑和渲染效果。在这个案例中,开发者可能创建了一个名为`CarDashboardView`的新类,继承自...
本教程将深入讲解如何在Android中实现炫酷且简单的轮播控件。 一、轮播控件的基本概念 轮播控件,也称为滑动图片展示器,它允许用户通过滑动或自动切换来浏览多张图片或视图。在Android中,我们可以使用现成的库,...
- 使用View的测量(onMeasure())和布局(onLayout())方法来正确确定自定义视图的尺寸和位置。 8. **测试与调试**: - 在真实设备或模拟器上进行测试,确保动画流畅且没有内存泄漏。 - 使用Android Studio的...