自定义viewGroup(3)

原创 2018年04月15日 20:18:58

ackage example.com.attrsviewgroup;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * author:Created by niuyuejiao on 2018/4/14.
 */

public class MyViewGroup extends ViewGroup {


    private int orientation = 0;
    int marignTop = 30;//上边距
    int marignVerCenter = 10;//横行时中间距离
    int marignHorCenter = 10;//纵行时中间
    int marignLeft = 20;//左边距


    public MyViewGroup(Context context) {
        this(context, null);
    }


    public MyViewGroup(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        inintView(context, attrs, defStyleAttr);
    }

    private void inintView(Context context, AttributeSet attrs, int defStyleAttr) {
        //或得样式属性
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyViewGroup);
    //得到属性值,默认是0(纵行的)
    orientation = typedArray.getInt(R.styleable.MyViewGroup_ori, 1);

}

    //测量
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //定义一个总的宽和高
        int totalHeight = 0;
        int totalWidth = 0;
        //遍历子view的数量
        for (int i = 0; i < getChildCount(); i++) {
            View childAt = getChildAt(i);
            measureChild(childAt, widthMeasureSpec, heightMeasureSpec);
            //判断
            if (orientation == 0) {//纵行0
                totalHeight += childAt.getMeasuredHeight() + marignVerCenter;
                totalWidth = childAt.getMeasuredWidth() + marignLeft * 2;
            } else if (orientation == 1) {//横行1
                totalHeight = childAt.getMeasuredHeight() + marignTop * 2;
                totalWidth += childAt.getMeasuredWidth() + marignHorCenter;
            } else if (orientation == 2) {//all
                totalHeight += childAt.getMeasuredHeight() + marignVerCenter;
                totalWidth += childAt.getMeasuredWidth() + marignHorCenter;
            }
        }
        //模式
        int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
        int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
        //宽高
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);

        if (orientation == 0) {//纵行0
            switch (modeHeight) {
                case MeasureSpec.AT_MOST:
                    totalHeight += marignTop * 2 - marignVerCenter;
                    break;
                case MeasureSpec.EXACTLY:
                    totalHeight = sizeHeight;
                    break;

            }
        } else if (orientation == 1) {//横行1
            switch (modeWidth) {
                case MeasureSpec.AT_MOST:
                    totalWidth += marignLeft * 2 - marignHorCenter;
                    break;
                case MeasureSpec.EXACTLY:
                    totalWidth = sizeWidth;
                    break;

            }
        } else if (orientation == 2) {//all
            switch (modeHeight) {
                case MeasureSpec.AT_MOST:
                    totalHeight += marignTop * 2;
                    totalWidth += marignLeft * 2;
                    break;
                case MeasureSpec.EXACTLY:
                    totalWidth = sizeWidth;
                    break;
            }
            //totalHeight += marignTop;
        }

        setMeasuredDimension(totalWidth, totalHeight);
    }

    //布局
    @Override
    protected void onLayout(boolean b, int i, int i1, int i2, int i3) {
        int mLeft = marignLeft;//左边距
        int mTop = marignTop;//上边距
        int mHorCenter = marignHorCenter;//两个子view横行中间的间距
        int mVerCenter = marignVerCenter;//两个子view纵行中间的间距
        //遍历子view的数量
        for (int j = 0; j < getChildCount(); j++) {
            View childAt = getChildAt(j);
            //获取子view的宽和高
            int measuredHeight = childAt.getMeasuredHeight();
            int measuredWidth = childAt.getMeasuredWidth();
            childAt.layout( mLeft, mTop, mLeft + measuredWidth, mTop + measuredHeight);
            if (orientation == 0) {//                mTop += measuredHeight + mVerCenter;
            } else if (orientation == 1) {//                mLeft += measuredWidth + mHorCenter;
            } else if (orientation == 2) {//all
                mTop += measuredHeight + mVerCenter;
                mLeft += measuredWidth + mHorCenter;
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="MyViewGroup">
        <attr name="orientation" format="integer" />
        <attr name="ori" format="enum">
            <enum name="vertical" value="0" />
            <enum name="horizontal" value="1" />
            <enum name="all" value="2" />
        </attr>

    </declare-styleable>
</resources>
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/niu_yue_jiao/article/details/79952665

自定义ViewGroup实现标签换行(动态创建标签

具体实现步骤:  1.继承ViewGroup,实现三个构造方法  2.通过generateLayoutParams给自定义的控件指定参数  3.实现onMeasure方法         a.在这个方...
  • u010419467
  • u010419467
  • 2015-08-03 14:43:00
  • 707

Android自定义View或ViewGroup的流程

对于onMeasure()方法-->不论是View还是ViewGroup,onMeasure方法其实都是在测量自身的宽和高,只是对于ViewGroup来讲,当该ViewGroup的父容器为其设置的计算...
  • shakespeare001
  • shakespeare001
  • 2016-04-07 21:09:19
  • 1923

对比自定义view和自定义viewgroup

view 的onDraw()和ViewGroup的dispatchDraw()方法最近在研究view的整个事件过程,以及自定义view的绘制,今天突然发现还有dispatchDraw(),于是在官方a...
  • outdoorsmanm
  • outdoorsmanm
  • 2016-03-17 18:35:12
  • 1636

自定义ViewGroup实现弹性滑动效果

使用自定义ViewGroup实现弹性滑动的效果
  • y874961524
  • y874961524
  • 2016-10-07 21:59:55
  • 746

android之自定义View和ViewGroup(二)(此篇不讲述代码,只讲述原理和结构,带你走进自定义的世界)

上一篇(android之自定义View和ViewGroup分析(一))中已经讲过了关于自定义View的实现原理以及实现步骤和相关的方法分析,所以这篇就不讲自定义View了,讲讲自定义ViewGroup...
  • gsw333
  • gsw333
  • 2016-07-13 17:07:03
  • 487

Android自定义ViewGroup(四、打造自己的布局容器)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:【openXu的博客】 目录:简单实现水平排列效果 ...
  • u010163442
  • u010163442
  • 2016-05-25 17:38:19
  • 15879

自定义viewGroup打造花式布局

维护维护在维护,改版改版复改版! 最近项目在改版,UI给了如下的一张新界面: 首先拿到界面时,美工说为了防止界面显得太长,当图片List小于4个的时候则就竖直排列,如果大于或等于5个的时候的第一到...
  • aa4100123
  • aa4100123
  • 2016-10-13 16:24:19
  • 931

自定义viewgroup里面嵌套viewgroup布局出问题,如fill_parent失效

我的一个新项目用到了一个自定义可以拖动的控件,我在网上找到了一个demo,是通过重写viewgroup来实现的,但是当我真正投入 使用的时候,发现我在里面自己写的布局fill_parent失效,找了...
  • wuqingbin
  • wuqingbin
  • 2014-04-01 13:06:18
  • 1388

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

ViewGroup学习 demo:在ViewGroup中显示一个TextView demo:在ViewGroup中显示两个TextView 并且按照某种效果进行布局...
  • u012391876
  • u012391876
  • 2016-11-10 17:39:00
  • 5846

自定义ViewGroup之margin和padding

都知道  android:layout_margin指该控件距离边父控件的边距, android:padding指该控件内部内容,如文本距离该控件的边距。 对于到自定义View 中是如何处理pa...
  • easion_zms
  • easion_zms
  • 2015-12-14 16:03:40
  • 504
收藏助手
不良信息举报
您举报文章:自定义viewGroup(3)
举报原因:
原因补充:

(最多只允许输入30个字)