美文网首页
自定义View - 19.自定义View和ViewGroup套路

自定义View - 19.自定义View和ViewGroup套路

作者: zsj1225 | 来源:发表于2018-07-03 21:09 被阅读11次

    1自定义View的套路:

    1.1 自定义属性,获取自定义属性(实现配置的效果)
    1.2 onMeasure()方法用于测量计算自己的宽高,前提是继承自View,如果是继承自系统已有的 TextView , Button ,已经给你计算好了宽高,就测量自己的宽高.

    //套路:
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //计算自己的宽高 
        int width = 
        //来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)
        int widthSize = resolveSize(width, widthMeasureSpec);
    }
    

    1.3 onDraw() 用于绘制自己的显示
    1.4 onTouch() 用于与用户交互

    2 自定义ViewGroup的套路:

    2.1 自定义属性,获取自定义属性(达到配置的效果)很少有
    2.2 onMeasure() 方法,for循环测量子View,根据子View的宽高来计算自己的宽高

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            //
            int width = 
            //for循环测量子View
            int childCount = getChildCount();
            for (int i = 0; i < childCount; i++) {
                    //获取子View
                View childView = getChildAt(i);
                // 这段话执行之后就可以获取子View的宽高,因为会调用子View的onMeasure
                measureChild(childView, widthMeasureSpec, heightMeasureSpec);
    
                //根据子View的宽高来计算自己的宽高
                width += childView.getMeasuredWidth()
            }
    
          //来让子 View 的计算结果符合父 View 的限制        
          width = resolveSize(width, widthMeasureSpec);
          //指定自己的宽高
          setMeasuredDimension(width, height);
    }
    

    2.3 onDraw() 一般不需要,默认情况下是不会调用,如果你要绘制需要实现dispatchDraw()方法
    2.4 onLayout() 用来摆放子View,前提是不是GONE的情况
    2.5 在很多情况下不会继承自ViewGroup ,往往是继承 系统已经提供好的ViewGroup 如 ViewPager ScrollView RelativeLayout.

    相关文章

      网友评论

          本文标题:自定义View - 19.自定义View和ViewGroup套路

          本文链接:https://www.haomeiwen.com/subject/nkojuftx.html