一:先看一段代码,截图自定义进度条中,在ondraw方法中的一段,从代码中可以看到
getWidth(), getHeight()
getPaddingLeft(), getPaddingRight()
下面来说说这些方法怎么使用,和解释
getHight(), getWidth() 直接表示自定义控件的宽和高
自定义view中经常要获取控件的宽度和高度,方法是getWidth(),getHeight()
注意:他们是在onMeasure方法执行完对宽,高计算完成时,才调用的,所以他们可以在onlayout,ondraw等方法中调用。
getPaddingLeft(), getPaddingRight(),getPaddingTop(), getPaddingBottom()
自定义view中显示内容到控件边界的左,右,高,底的距离
注意:padding表示内部到控件边界的距离,padding的距离还是在view自身,使用计算常常用到,下图是padding和margin的区分!
View 宽和高准确的测量
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//view的宽度和高度测量(在viewTree里测量才准确)
viewWidth = getWidth();
viewHeight = getHeight();
//移除之前已经注册的全局布局回调函数
getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
文字宽和高的测量
//文字的宽度测量
textLength = paint.measureText(getText().toString);
//文字的高度测量
textHeight = paint.descent()+paint.ascent();
二:invalidate, postinvalidate, requestLayout 区分
requestLayout
当一个VIEW的布局属性发生了变化的时候,可以调用该方法,让父VIEW调用onmeasure 和onlayout重新定位该view的位置,需要在UI线程调用
**invalidate **
强制使view重绘,需要在UI主线程调用
postinvalidate
作用同上,但是可以直接在子线程调用