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

onLayout方法:

@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布局:


效果如图所示:

上图MyViewGroup是蓝色,两个子View分别为红色和绿色。

在自定义View中,onLayout配合onMeasure方法一起使用,可以实现自定义View的复杂布局。自定义View首先调用onMeasure进行测量,然后调用onLayout方法,动态获取子View和子View的测量大小,然后进行layout布局。

Android onLayout、layout区别相关推荐

  1. android子view获取父布局,Android获取布局父ID(Android get layout parent id)

    Android获取布局父ID(Android get layout parent id) 我想知道View和ViewParent有什么区别? 我想获取ImageView父级的Id,但我不能这样做: m ...

  2. Android系统布局——android.R.layout详解

    布局文件,作为android中必不可少的一部分,android系统为了方便开发人员,在系统中定义了很多的布局文件. 系统布局文件和我们自定义的布局在写法用前缀android以示区别: 系统布局文件:a ...

  3. android:layout_gravity 和 android:gravity 的区别

    gravity 这个英文单词是重心的意思,在这里就表示停靠位置的意思. android:layout_gravity 和 android:gravity 的区别 从名字上可以看到,android:gr ...

  4. android:windowBackground 和 android:background 的区别

    通过问别人,我知道了android:windowBackground 和 android:background的区别 android:windowBackground 一般用于activity启动的时 ...

  5. ImageView---属性android:background与android:src的区别

    ImageView中XML属性android:src和android:background的区别: android:background会根据ImageView组件给定的长宽进行拉伸.android: ...

  6. sdk数值与android版本,Android SdkVersion的区别及获取版本信息方法

    1.minSdkVersion,targetSdkVersion,maxSdkVersion,compileSdkVersion四个数值之间有什么区别? • minSdkVersion,maxSdkV ...

  7. ListView加ArrayAdapter结合android.R.layout.activity_list_item快速实现图文显示

    核心代码如下: ArrayAdapter<ResolveInfo> adapter=new ArrayAdapter<ResolveInfo>(getActivity(), a ...

  8. android布局layout中的一些属性

    为什么80%的码农都做不了架构师?>>>    1.可以使某些资源文件或UI组件可重用 <include layout="@layout/other"/&g ...

  9. android L和android M的区别

    android L与android M的区别主要还是应该关注M对L的改进.Android M相比Android Lollipop(5.0)有六项重大的改进: 1.App Permissions(软件权 ...

  10. Android UI Layout 之 AbsoluteLayout

    Android UI Layout 之 AbsoluteLayout 在 Android UI 中,最基本的构建单位(building block)是 android.view.View.一个 Vie ...

最新文章

  1. MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
  2. 读秦小波《设计模式之禅》 -- 单例模式
  3. Java高并发系统的限流策略
  4. SAP Spartacus的用户登录请求
  5. 工作195:解决key值不唯一的报错
  6. 插入模板_WordPress在文章列表和内容页插入广告
  7. java 调用 mahout_java – 运行Mahout本地获取MahoutDriver的ClassNotFoundException
  8. 多核处理器互联网络拓扑结构
  9. 计算机发展史上的重要人物和公司,汉字发展史上的重要人物
  10. 金武彩印机械设备有限公司仓储管理系统设计与实现
  11. STM32L4时钟系统(转载)
  12. 看完就会flink基础API
  13. kinectfusion解析_KinectFusion介绍
  14. 某网站X-Signature签名破解
  15. 通过不同的查询方式解决笛卡尔集问题
  16. 学习使用微信小程序动态获取当前时间并实时跳动
  17. JS通过 身份证号码 获取 出生年月日 和 性别
  18. 搭建阿里云服务器的步骤
  19. JS实现搜索功能页面(可搜索,无需数据库,无后端)
  20. android话费查询接口,Android 小应用--一键查话费移动版(附源码)

热门文章

  1. 甘蔗歉收糖价大涨,游资热捧白糖期货
  2. 电脑桌面日程表怎么做?
  3. 最新突破!天然产物首次实现全合成,轰动整个化学界
  4. Windows系统组件漏洞
  5. MySQL 字符集 注意事项
  6. k8s containerd对接harbor私有仓库
  7. 微信小程序 滑块视图容器
  8. Jackson快速替换Fastjson之道
  9. CSS常用属性-3.1字体文字-1.字体font-family-2.尺寸font-size-3.样式font-style-4.粗细font-weight-5.简写属性font
  10. java sofa rpc_引用 SOFARPC 服务