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

2018-07-03  本文已影响11人  zsj1225

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.

上一篇下一篇

猜你喜欢

热点阅读