• 简单的自定义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);
        }
    }
  • 相关阅读:
    form表单提交后保持输入的值
    django 自定义属性
    linux修改mysql密码
    linux下备份mysql数据库
    《小学数学辅导》服务协议
    《小升初辅导》服务协议
    《小学数学试题练习》服务协议
    清明节应该回高中学校扫扫墓,因为那里埋葬了你的青春。
    [转]智能聊天机器人小黄鸡及其制作方法
    人们问我,长大了要做什么?我写下“快乐”,他们说我理解错了题目。我告诉他们,他们理解错了人生。—— 约翰·列侬
  • 原文地址:https://www.cnblogs.com/MiniHouse/p/7100482.html
Copyright © 2020-2023  润新知