简单的自定义ViewGroup
自定义ViewGroup需要重写onMeasure, onLayout等方法。下面是一个实例,4个View分别显示在四个角。
public class MyGroup extends ViewGroup{
    private View viewA, viewB, viewC, viewD;
    public MyGroup(Context context) {
        this(context, null);
    }
    public MyGroup(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public MyGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
        // 计算出所有的childView的宽和高
        measureChildren(widthMeasureSpec, heightMeasureSpec);
        int totalW1 = 0, totalH1 = 0;
        int totalW2 = 0, totalH2 = 0;
        for(int i=0; i<getChildCount(); ++i){
            View child = getChildAt(i);
            MarginLayoutParams params = (MarginLayoutParams)child.getLayoutParams();
            int cw = child.getMeasuredWidth(), ch = child.getMeasuredHeight();
            int lm = params.leftMargin, rm = params.rightMargin;
            int tm = params.topMargin, bm = params.bottomMargin;
            if(i == 0){
                totalW1 += lm + cw + rm;
                totalH1 += tm + ch + bm;
            }
            else if(i == 1){
                totalW1 += lm + cw + rm;
                totalH2 += tm + ch + bm;
            }
            else if(i == 2){
                totalW2 += lm + cw + rm;
                totalH1 += tm + ch + bm;
            }
            else if(i == 3){
                totalW2 += lm + cw + rm;
                totalH2 += tm + ch + bm;
            }
        }
        int width = Math.max(totalW1, totalW2);
        int height = Math.max(totalH1, totalH2);
        int targetWidth = sizeWidth;
        int targetHeight = sizeHeight;
        if(widthMode == MeasureSpec.AT_MOST){
            targetWidth = width;
        }
        if(heightMode == MeasureSpec.AT_MOST){
            targetHeight = height;
        }
        setMeasuredDimension(targetWidth, targetHeight);
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        for(int i=0; i<getChildCount(); ++i){
            View child = getChildAt(i);
            MarginLayoutParams params = (MarginLayoutParams)child.getLayoutParams();
            int cw = child.getMeasuredWidth();
            int ch = child.getMeasuredHeight();
            int lm = params.leftMargin;
            int tm = params.topMargin;
            int rm = params.rightMargin;
            int bm = params.bottomMargin;
            if(i == 0){
                child.layout(lm, tm, lm+cw, tm+ch);
            }
            else if(i == 1){
                child.layout(getWidth()-rm-cw, tm, getWidth()-rm, tm+ch);
            }
            else if(i == 2){
                child.layout(lm, getHeight()-bm-ch, lm+cw, getHeight()-bm);
            }
            else if(i == 3){
                child.layout(getWidth()-rm-cw, getHeight()-bm-ch, getWidth()-rm, getHeight()-bm);
            }
        }
    }
    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
//        return super.generateLayoutParams(attrs);
        return new MarginLayoutParams(getContext(), attrs);
    }
    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
    }
}
简单的自定义ViewGroup的更多相关文章
- 简单的例子了解自定义ViewGroup(一)
		
在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...
 - Android ViewDragHelper完全解析 自定义ViewGroup神器
		
Android ViewDragHelper完全解析 自定义ViewGroup神器 转载请标明出处: http://blog.csdn.net/lmj623565791/article/detai ...
 - Android动画效果之自定义ViewGroup添加布局动画
		
前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢?今天结合自定义ViewGroup来学习一下布局动画.本文将通 ...
 - Android自定义控件之自定义ViewGroup实现标签云
		
前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...
 - Android自定义ViewGroup
		
视图分类就两类,View和ViewGroup.ViewGroup是View的子类,ViewGroup可以包含所有的View(包括ViewGroup),View只能自我描绘,不能包含其他View. 然而 ...
 - [Android Pro]   Android开发实践:自定义ViewGroup的onLayout()分析
		
reference to : http://www.linuxidc.com/Linux/2014-12/110165.htm 前一篇文章主要讲了自定义View为什么要重载onMeasure()方法( ...
 - android 手把手教您自定义ViewGroup(一)
		
1.概述 在写代码之前,我必须得问几个问题: 1.ViewGroup的职责是啥? ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属 ...
 - Android 自定义ViewGroup
		
前面几节,我们重点讨论了自定义View的三板斧,这节我们来讨论自定义ViewGroup,为什么要自定义ViewGroup,其实就是为了更好的管理View. 自定义ViewGroup无非那么几步: Ⅰ. ...
 - android自定义viewgroup实现等分格子布局
		
先上效果图: 实现这样的效果: 一般的思路就是,直接写布局文件,用LinearLayout 嵌套多层子LinearLayout,然后根据权重layout_weight可以达到上面的效果 还有就是利用g ...
 
随机推荐
- c++函数集锦
			
1.标准C++库字符串类std::string的用法 begin 得到指向字符串开头的Iterator end 得到指向字符串结尾的Iterator rbegin ...
 - (后端)spring的@Transactional注解详细用法(转)
			
转自一人浅醉-博客园: 事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度.TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinit ...
 - python之模块使用
			
1.入口 """ 模块测试入口 """ import show_message as sm # 导入方式一 sm.show(sm.__nam ...
 - VMWare 虚拟机设置网络访问
			
使用桥接模式 将本机IP设置为和虚拟机IP在同一个可以上网的网段中
 - python3中list列表的一些操作
			
最近遇到许多List的操作,感觉它是一种很重要的一种基础数据结构,本人掌握的也不是很扎实,这里找了一些列表的操作,常用函数,记录下来,希望对大家有用.如果理解有偏差,欢迎指正,感谢! (1)列表的合并 ...
 - [Hive_6] Hive 的内置函数应用
			
0. 说明 Hive 的内置函数的基本操作 | 时间函数 | String 函数 | 条件语句 | explode | split | substring 1. 基本操作 查看函数 show func ...
 - numpy中stack、hstack,vstack,dstack函数功能解释
			
https://blog.csdn.net/Riverhope/article/details/78922006 https://blog.csdn.net/ygys1234/article/deta ...
 - xshell的一些常用配置
			
1 在xshell中鼠标滚轮和右键的快捷方式 利用鼠标滚轮和右键快速粘贴上面复制的内容 打开xshell的工具---选项-----键盘和鼠标 点击确定 回到xshell即可使用
 - Python里面search()和match()的区别
			
转自https://www.cnblogs.com/aaronthon/p/9435967.html match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None searc ...
 - C#事件の事件访问器
			
在真实的项目中,有的对象有相当多的事件,例如一个窗体就有好多种事件.默认情况下,当声明事件时,编译器将内存分配给一个事件字段,一存储事件信息.如果类中有好多事件未使用,则他们会不必要的占用内存. 这种 ...