自定义View--View的Layout/ondraw 过程
2016-08-30 本文已影响54人
heiheiwanne
layout主要是设置view的4个坐标
setChildFrame(left,top,right,bottom);
getMeasuredHeight() 和getWidth() 区别:
public final int getWidth(){
return mRight - mLeft;
}
public final int getHeight(){
return mBottom - mTop;
}
在View的默认实现中,View的测量宽/高和最终的宽哥是相等的,只不过测量宽高形成于View的Mearsure过程,而最终宽高是形成于View的layout过程,即两者的赋值时机不同,测量宽高的赋值时机稍微早一些,因此,在日常开发中,我可以认为View的测量宽高跟最终宽高相同,但是也有例外,例如如下:
public void layout(int l, int t , int r , int b ){
super.layput(l,t+100,r+100,b );
}
view宽高
getSuggestedMinimumWidth 中: 如果View没有设置北京,那么View的宽高几位mMinWidth,即android:minWidth属性。这个属性不如不指定默认为0 ,如果View指定了北京,view的宽高为max(mMinWidth,mBackground.getMinimumWidth())
draw过程:
- 绘制背景background.draw(canvas)
- 绘制自己(onDraw)
- 绘制children (dispatchDraw)
- 绘制装饰(onDrawScrollBars)
View有一个特殊的方法setWillNotDraw,
如果一个View不需要绘制任何内容,那么设置这个标记为true之后,系统会进行相应的优化。默认情况下,View没有启用这个优化标记位,但是ViewGroup会默认启用这个优化标记为。这个标记为,对实际开发的意义是:当我们的自定义控件继承于ViewGroup并且本身不具备绘制功能是,就可以开启这个标记为,从而便于系统后续的优化。当然,明确指导一个ViewGroup 需要通过onDraw来绘制内容时,我们需要显示的关闭WILL_NOT_DRAW这个标记位