onLayout设置子控件的位置,对应一些普通的控件例如Button、TextView等控件,不存在子控件,所以可以不用复写该方法。

向线性布局、相对布局等存在子控件,可以覆写该方法去控制子控件的位置。

1、第一步首先创建一个类继承ViewGroup

2、在该group添加一个TextView,手机运行在1080*1920的手机上,我们设置TextView的宽度是540 高的是960

3、我们首先要在OnMesure中获得TextView的宽度和高度

4、然后在onLayout中进行设定

  1. protected void measureChild(View child, int parentWidthMeasureSpec,
  2. int parentHeightMeasureSpec)

关于View中的layout方法的四个参数,我们首先把view当成是一个矩形区域,四个参数一次代表view的左端、顶端、右端和底端距父控件坐标原点的距离

我们首先看看xml的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="im.weiyuan.com.zidingyikongjian.MainActivity"> <im.weiyuan.com.zidingyikongjian.LayoutView
android:layout_width="match_parent"
android:background="@color/colorPrimaryDark"
android:layout_height="match_parent">
<TextView
android:text="24242425"
android:background="@color/colorAccent"
android:layout_width="540px"
android:layout_height="960px" />
</im.weiyuan.com.zidingyikongjian.LayoutView>
</LinearLayout>

我们再来看看程序的代码

package im.weiyuan.com.zidingyikongjian;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup; /**
* Created by wei.yuan on 2017/6/2.
*/ public class LayoutView extends ViewGroup {
public LayoutView(Context context) {
super(context);
} public LayoutView(Context context, AttributeSet attrs) {
super(context, attrs);
} public LayoutView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} //首先要获得当前控件中的宽度和高度,才能在onLayout中去知道控件的宽度和高度
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int childCount = getChildCount();//判断是否存在子控件
if(childCount >0){
Log.d("123456","onMeasure is called");
View childView = getChildAt(0);//获得第一个子控件
//测量出当前子控件的大小
measureChild(childView,widthMeasureSpec,heightMeasureSpec);
}
} @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int childCount = getChildCount();//判断是否存在子控件
if(childCount >0){
View childView = getChildAt(0);//获得第一个子控件
//让子控件在屏幕的中点开始填充屏幕
int childWidth = childView.getMeasuredWidth();//主要getMeasuredWidth函数的值必须调用了measureChild才存在值
int childHeigth = childView.getMeasuredHeight();
Log.d("123456 childWidth",""+childWidth);
Log.d("123456 childHeigth",""+childHeigth);
childView.layout(540,0,childWidth+540,childHeigth);//设置子控件的位置,需要首先获得子控件的大小
}
}
}

我们来看看程序运行的效果:

上面如果设置成

childView.layout(0,0,childWidth,childHeigth);//设置子控件的位置,需要首先获得子控件的大小
运行的效果是:

												

android自定义控件onLayout方法的更多相关文章

  1. android自定义控件onMeasure方法

    1.自定义控件首先定义一个类继承View 有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/ ...

  2. Android的onLayout、layout方法讲解

    onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置.放置子View很简单,只需在重写onLayout方法,然后获取子View的实例,调用子View的layout方 ...

  3. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

  4. Android自定义控件之自定义ViewGroup实现标签云

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...

  5. Android 自定义控件之继承ViewGroup创建新容器

    欢迎大家来学习本节内容,前几节我们已经学习了其他几种自定义控件,分别是Andriod 自定义控件之音频条及 Andriod 自定义控件之创建可以复用的组合控件还没有学习的同学请先去学习下,因为本节将使 ...

  6. android自定义控件(1)-点击实现开关按钮切换

    自定义控件的步骤.用到的主要方法:   1.首先需要定义一个类,继承自View:对于继承View的类,会需要实现至少一个构造方法:实际上这里一共有三个构造方法: public View (Contex ...

  7. Android自定义控件(状态提示图表) (转)

    源:Android自定义控件(状态提示图表) 源:Android应用开发 [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1  背景 前面分析 ...

  8. Android自定义控件总结

    自定义控件分类: 1.使用系统控件,实现自定义的效果 2.自己定义一个类继承View ,如textView.ImageView等,通过重写相关的方法来实现新的效果 3.自己定义一个类继承ViewGro ...

  9. 自定义ViewGroup基础巩固1---理解onLayout()方法

    自定义ViewGroup这个是在android中自定义控件中不可获缺的很重要的一部分,关于它的意义这里就不过多阐述了,为了在未来深入上继续走下去,所以先把基础给打牢. 这篇主要是理解ViewGroup ...

随机推荐

  1. NIO 的非阻塞式网络通信

    1.阻塞与非阻塞   ①  传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时, 该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因 ...

  2. 画出决策边界线--plot_2d_separator.py源代码【来自python机器学习基础教程】

    import numpy as np import matplotlib.pyplot as plt from .plot_helpers import cm2, cm3, discrete_scat ...

  3. 10 个提高效率的 Linux 命令别名

    在 Linux 环境下工作的工程师,一定会对那些繁琐的指令和参数命令行印象深刻吧.而且,可怕的不是繁琐,而是需要大量重复输入这些繁琐的命令. 在 Linux 下我们有个别名命令 alias ,可以将那 ...

  4. 【Hadoop高级】Hadoop HA、hdfs安全模式

    Hadoop HA Safemode(安全模式) During start up the NameNode loads the file system state from the fsimage a ...

  5. Java实现 蓝桥杯 算法训练 画图(暴力)

    试题 算法训练 画图 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩 ...

  6. Java实现 蓝桥杯VIP 算法训练 数组查找及替换问题

    描述 给定某整数数组和某一整数b.要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序.如果数组元素数值在A到Z的ASCII之间,替换为对应字母.元素个数不超过100,b在1至100 ...

  7. Java实现第九届蓝桥杯第几天

    第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. import java.util.Cal ...

  8. java实现第五届蓝桥杯李白打酒

    李白打酒 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5 ...

  9. python—模块与包

    模块: (一个.py文件就是一个模块module,模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.) 模块分三种: 1.python标准库 2.第三方模块 3.应用程序自定义模块 ...

  10. Python快速入门文档

    前言 此文本质为本人学习Python过程中的笔记,部分地方叙述表达可能不够清晰,欢迎留言. (本文适合有一定程序语言基础的读者阅读(最好是c语言)) 一.基本语法 1.框架: (1)以缩进表示层次所属 ...