简单的自定义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);
    }
}
时间: 2024-11-04 15:50:08

简单的自定义ViewGroup的相关文章

最简单的自定义ViewGroup

FlowLayout 子View们的宽度加起来超过一行,会自动换行显示. 核心就两步: 在Layout中的onMeasure方法中调用子View的measure(),这儿虽然用的是measureChild方法,但最终还是去调用子View的measure() 在Layout中的onLayout方法中调用子View的layout() 再复杂的自定义View都是这样从最简单的形式,不断增加代码,迭代出来的 最简单的自定义ViewGroup: public class FlowLayout extend

Android ViewDragHelper完全解析 自定义ViewGroup神器

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46858663: 本文出自:[张鸿洋的博客] 一.概述 在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是一件很不容易的事,需要自己去处理:多手指的处理.加速度检测等等. 好在官方在v4的支持包中提供了ViewDragHelper

【Android自定义ViewGroup】不一样的轮子,巧用类变量解决冲突,像IOS那样简单的使用侧滑删除,一个控件搞定Android item侧滑删除菜单。

================================================================================== [1 序言] 侧滑删除的轮子网上有很多,最初在github上看过一个,还是ListView时代,那是一个自定义ListView 实现侧滑删除的,当初就觉得这种做法不是最佳,万一我项目里又同时有自定义ListView的需求,会增加复杂度. 写这篇文章之前又通过毒度搜了一下,排名前几的CSDN文章,都是通过自定义ListVIew和Vie

【自定义控件】自定义ViewGroup 在ViewGroup中显示TextView

需求:在ViewGroup中显示一个TextView 1.继承ViewGroup 必须要实现其构造方法和一个onLayout方法 构造函数的处理: public CusViewGroup(Context context) { this(context, null); } public CusViewGroup(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CusViewGroup(Context

【Android 开发技巧】逼格提升指南 —— 如何自定义ViewGroup

本文由 孙国威 原创.如需转载,请注明出处! 这篇文章准备说说如何自定义ViewGroup.对于新手来说,自定义ViewGroup是那种大牛级别的人物才能掌握的东西,自己却望而生畏. 不要怕,请谨记"一切新事物都是纸老虎,只要肯去花时间钻研,没有学不会的东西". 废话不多说,接下来,就让我们来揭开自定义ViewGroup的神秘面纱. 依照惯例,先从一个例子说起. 很简单,3张扑克牌叠在一起显示.这个布局效果该如何实现呢?有的同学该说了,这很简单啊,用RelativeLayout或Fra

Android自定义ViewGroup(一)——带箭头的圆角矩形菜单

今天要做一个带箭头的圆角矩形菜单,大概长下面这个样子: 要求顶上的箭头要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置. 最简单的做法就是让UX给个三角形的图片往上一贴,但是转念一想这样是不是太low了点,而且不同分辨率也不太好适配,干脆自定义一个ViewGroup吧! 自定义ViewGroup其实很简单,基本都是按一定的套路来的. 一.定义一个attrs.xml 就是声明一下你的这个自定义View有哪些可配置的属性,将来使用的时候可以自由配置.这里声明了7个属性,分别是:箭头宽度.箭头

自定义ViewGroup

定义一个自定义View组件,如果只是关注这个View的外观和大小,那么,要重写onDraw,onMeasure这两个方法.比如,我自定义了一个LabelView. 自定义完View之后,该View就可以像TextView之类的在一个ViewGroup中被使用了. ViewGroup中,会对存放在它其中的子View(childView)进行摆放.常见的ViewGroup有LinearLayout,RelativeLayout,FrameLayout. 那么,如果要实现一个自定义的ViewGroup

Android--Android 手把手教您自定义ViewGroup(一)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38339817 , 本文出自:[张鸿洋的博客] 最近由于工作的变动,导致的博客的更新计划有点被打乱,希望可以尽快脉动回来~ 今天给大家带来一篇自定义ViewGroup的教程,说白了,就是教大家如何自定义ViewGroup,如果你对自定义ViewGroup还不是很了解,或者正想学习如何自定义,那么你可以好好看看这篇博客 1.概述 在写代码之前,我必须得问几个问题: 1.ViewGr

[Android Pro] Android开发实践:自定义ViewGroup的onLayout()分析

reference to : http://www.linuxidc.com/Linux/2014-12/110165.htm 前一篇文章主要讲了自定义View为什么要重载onMeasure()方法(见 http://www.linuxidc.com/Linux/2014-12/110164.htm),那么,自定义ViewGroup又都有哪些方法需要重载或者实现呢 ? Android开 发中,对于自定义View,分为两种,一种是自定义控件(继承View类),另一种是自定义布局容器(继承ViewG