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 重写ViewGroup 分析onMeasure()和onLayout()方法的相关资料,需要的朋友可以参考下
NULL 博文链接:https://qq187155685.iteye.com/blog/1442778
onLayout在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下。View绘制过程就好比你向银行贷款, 在Android中view如何完成绘制这个过程介绍了很多,但是很多...
1.1 用Layout方法 我们知道,当view在绘制时会调用onlayout方法来设置显示位置。同样也可以通过view的left、top, right,buttom 四个属性来控制view的坐标。每次在ontouchevent的时候,我们都要获取一下触摸点的...
Android流式布局简单实现,通过继承ViewGroup,重写OnLayout方法,实现标签的流式布局
自定义layout组合,onLayout,onMeasure,onFinishInflate,onDraw
博客《FlowLayout详解(一)——onMeasure()与onLayout()》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/47029169
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 ...
背景:楼主本人的电脑在某一段时间使用过程中,只要一启动模拟器上我们的APP,电脑散热风扇的声音就加大,...这个自定义view在onDraw方法中,调用了一个很不起眼的方法:setLayoutParams. 将这个方法去掉之后,界面滑动
本文实例讲述了Android继承ViewGroup实现Scroll滑动效果的方法。分享给大家供大家参考,具体如下: extends ViewGroup需要重写onMeasure和onLayout方法 onMeasure方法是去测量ViewGroup需要的大小以及包含的子View...
通过重写onLayout方法,判断软键盘是否弹出。判断到键盘是否弹出后,就可以做自己想做的事情了。
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...
该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法. setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View,然后刷新进行动态更新UI. 并且...
-- addHintView -- GuideView.onMeasure -- GuideView.onLayout -- GuideView.onDraw 使用 public void onResume() { super.onResume(); fragment.post(new Runnable() { @Override public void run() { ...
首先需要继承ViewGroup, 在这里我们需要重写它的onMeasure和onLayout方法。本项目中它的子View有两种填充方式,一种是Fill_PARENT,一种是WRAP_CONTENT,看名字应该能知道是什么意思吧。
首先考虑的是这样实现比较简单,代码量不多,简单易懂,不用涉及AdapterView里的一些复杂View显示方法(onMeasure,onLayout等),回收算法也是采用相对简单实用的方式,虽然那个现在还有Bug,就是突然刷新到第一页的...
这是一个自定义相对布局 里面重写了onSizechange onMearuse onLayout三个方法 这个是自定义控件中常用的需要重写的一些方法 三个方法的执行顺序就是按照上面的顺序执行的 希望初学者能够看下