No1Worker / Q-A

0 stars 0 forks source link

自定义View #11

Open zhiyongyu opened 4 years ago

zhiyongyu commented 4 years ago

layout和onLayout的区别: layout用于确定View自身位置。 onLayout是父View确定子View位置。 打个比方,比如说自定义一个控件,内部可以有多个View。onLayout可以去确定内部子View的位置,代码如下:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // 动态获取子View实例
    for (int i = 0, size = getChildCount(); i < size; i++) {
        View view = getChildAt(i);
        // 放置子View,宽高都是100
        view.layout(l, t, l + 100, t + 100);
        l += 100 + padding;
    }
}
zhiyongyu commented 4 years ago

measure和onMeasure()。 根据源码注释分析,measure方法测量该View应该有多大,比如其父类给其设置了一些规则等等,在measure中调用onMeasure方法测量该View具体有多大(比如内部有子View,则需要测量各个子View的大小以确定该View实际大小)。

zhiyongyu commented 4 years ago

draw和onDraw方法的区别: 根据源码注释分析,draw方法做了蛮多的事情: 1、绘制View的背景。 2、如有必要保存画布图层(不太理解,仍需研究)。 3、绘制View内容。 4、绘制子View。 5、如有必要绘制褪色边缘,恢复图层(不太理解,仍需研究)。 6、绘制装饰,例如滚动条之类的。 其中绘制View内容就是调用onDraw方法。 onDraw方法就是具体的绘制出View中需要展现出来的东西。比如TextView的text,ImageView的src图片等等。 draw方法中提到的第四步,绘制子View。就是调用dispatchDraw方法,绘制各个子View自己的内容,所以如果我们自定义一个ViewGroup,往往重写的是dispatchDraw方法。 Android官方提到"When implementing a view, do not override this method; instead, you should implement onDraw"(谷歌翻译:实现视图时,请勿覆盖此方法;相反,您应该实现onDraw)。