android 自定义view的常用各种宽和高的计算,以及其他注意点

一:先看一段代码,截图自定义进度条中,在ondraw方法中的一段,从代码中可以看到
getWidth(), getHeight()
getPaddingLeft(), getPaddingRight()

下面来说说这些方法怎么使用,和解释

android 自定义view的常用各种宽和高的计算,以及其他注意点_第1张图片
view_1.png

getHight(), getWidth() 直接表示自定义控件的宽和高

自定义view中经常要获取控件的宽度和高度,方法是getWidth(),getHeight()

注意:他们是在onMeasure方法执行完对宽,高计算完成时,才调用的,所以他们可以在onlayout,ondraw等方法中调用。

getPaddingLeft(), getPaddingRight(),getPaddingTop(), getPaddingBottom()

自定义view中显示内容到控件边界的左,右,高,底的距离

注意:padding表示内部到控件边界的距离,padding的距离还是在view自身,使用计算常常用到,下图是padding和margin的区分!

android 自定义view的常用各种宽和高的计算,以及其他注意点_第2张图片
201104261840454974.png

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
作用同上,但是可以直接在子线程调用

android 自定义view的常用各种宽和高的计算,以及其他注意点_第3张图片
invalidate .png

你可能感兴趣的:(android 自定义view的常用各种宽和高的计算,以及其他注意点)