自定义ViewGroup(可横向、可纵向、可两者皆可)

原创 2018年04月15日 20:34:40

attrs.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyViewGroup04">
        <attr name="orientation" format="integer"/>
        <attr name="ori" format="enum">
            <enum name="horizontal" value="1"></enum>
            <enum name="vertical" value="0"></enum>
            <enum name="all" value="2"></enum>
        </attr>
    </declare-styleable>
</resources>
MyViewGroup04
public class MyViewGroup04 extends ViewGroup {

    private int orientation = 0;
    private final int marginVertical = 20;//间距
    private final int marginHorizontal = 20;//间距
    int mTop = 20;
    int mLeft = 20;

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

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

    public MyViewGroup04(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs, defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyViewGroup04);//拿到属性文件
        orientation = typedArray.getInt(R.styleable.MyViewGroup04_ori, 0);//得到里面的ID
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int totalHeight = 0;
        int totalWidth = 0;

        for (int i = 0; i < getChildCount(); i++) {
            View childAt = getChildAt(i);
            measureChild(childAt,widthMeasureSpec, heightMeasureSpec);

            if (orientation == 0){
                totalHeight += childAt.getMeasuredHeight()+marginVertical;
                totalWidth = childAt.getMeasuredWidth()+mLeft*2;
            }else if (orientation == 1){
                totalWidth += childAt.getMeasuredWidth()+marginHorizontal;
                totalHeight = childAt.getMeasuredHeight()+mTop*2;
            }else if (orientation == 2){
                totalHeight += childAt.getMeasuredHeight()+marginVertical;
                totalWidth += childAt.getMeasuredWidth()+marginHorizontal;
            }
        }

        int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);

        int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);

        if (orientation == 0){
            //纵向
            switch (modeHeight){
                case MeasureSpec.AT_MOST:
                    totalHeight += mTop;
                    break;
                case MeasureSpec.EXACTLY:
                    totalHeight = sizeHeight;
                    break;
            }
        }else if (orientation == 1){
            //横向
            switch (modeWidth){
                case MeasureSpec.AT_MOST:
                    totalWidth += mLeft;
                    break;
                case MeasureSpec.EXACTLY:
                    totalWidth = sizeWidth;
                    break;
            }
        }else if (orientation == 2){
            switch (modeWidth){
                case MeasureSpec.AT_MOST:
                    totalWidth += mLeft;
                    totalHeight += mTop * 2;
                    break;
                case MeasureSpec.EXACTLY:
                    totalWidth = sizeWidth;
                    break;
            }
            //totalHeight += mTop;
        }

        setMeasuredDimension(totalWidth,totalHeight);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int childCount = getChildCount();
        int mVertical = marginVertical;
        int top = mTop;
        int mhorizontal = marginHorizontal;
        int left = mLeft;
        for (int i = 0; i < childCount; i++) {
            View childAt = getChildAt(i);
            childAt.layout(left,top,childAt.getMeasuredWidth()+left,childAt.getMeasuredHeight()+top);
            if (orientation == 0){
                top += childAt.getMeasuredHeight()+mVertical;
            }else if (orientation == 1){
                left += childAt.getMeasuredWidth()+mhorizontal;
            }else if (orientation == 2){
                top += childAt.getMeasuredHeight()+mVertical;
                left += childAt.getMeasuredWidth()+mhorizontal;
            }
        }

    }
}

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

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

ScrollerLayout——可横向滚动的自定义viewgroup

具体功能看效果图: 如何录屏小贴士 使用手机自带的录屏软件,录制后卫MP4格式,在使用下面这个网址介绍的方法,转为gif(我是用的是在线转的那个,挺好用) Android手机如何录制屏幕...
  • Android_Study_OK
  • Android_Study_OK
  • 2016-05-09 11:20:33
  • 2208

股票固定第一列可横向纵向滑动的列表

  • 2016年04月29日 13:57
  • 2.57MB
  • 下载

自定义RecyclerView 支持 横向纵向,滑动删除Item

自定义RecyclerView 支持 横向纵向,滑动删除Item
  • xufeifandj
  • xufeifandj
  • 2015-06-24 09:59:31
  • 5417

自定义ViewGroup学习(LinearLayout的布局方式,可以滚动和嵌套)

自定义ViewGroup学习(LinearLayout的布局方式,可以滚动和嵌套) 首先先看效果图 自定义ViewGroup,必须重写onLayout()方法 当然,还需要onMeasur...
  • xiaoguiyixue
  • xiaoguiyixue
  • 2016-07-07 14:27:29
  • 1889

自定义ViewGroup (滚动布局)

/**  *  * 转载请标明出处:http://blog.csdn.net/u013598111/article/details/50256847  *   @author:【JunTao_sun】...
  • u013598111
  • u013598111
  • 2015-12-11 20:35:53
  • 588

可以纵向横向滑动的表格实现

背景 这个效果是今天公司项目里面遇上的,也是第一次遇见这种需求,所以记录下来,效果如上图。需求主要是可以实现上下的滑动,并且同时最左侧的“线路名称”这一列在向左滑动的时候是不能跟...
  • pbz106
  • pbz106
  • 2017-03-16 18:28:30
  • 251

自定义ViewGroup(3):自定义流式布局

继承自ViewGroup的流式布局控件容器。 定义容器类的重要两步骤,也就是重载两个方法:决定容器大小的方法onMeasure,摆放子控件的方法onLayout。 所谓流式布局,就是所有的子控件横向依...
  • vqqYuAn
  • vqqYuAn
  • 2015-02-12 09:08:00
  • 504

Android仿人人客户端(v5.7.1)——采用ViewGroup做父容器,实现左侧滑动菜单(三)

转载请标明出处:http://blog.csdn.net/android_ls/article/details/8761410               前面已实现以滑动的方式显示或隐藏左侧菜单,...
  • android_ls
  • android_ls
  • 2013-04-05 17:31:53
  • 7194

android ScrollView弹性控件,横向和纵向滑动

  • 2016年07月04日 14:22
  • 1.55MB
  • 下载
收藏助手
不良信息举报
您举报文章:自定义ViewGroup(可横向、可纵向、可两者皆可)
举报原因:
原因补充:

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