关于View的invalidate()方法的理解

2018-07-10  本文已影响0人  most_xiaoya

问题:如果我调用view的invalidate() 那么会刷新view或者叫作view会进行重绘 这个大家都知道,那这个具体会有哪几个方法会执行,执行的顺序又是怎样呢?

为了解决这个问题呢,我们可以先自定义一个View 继承自View 并实现它的几个方法 代码如下:

public class MyView extends View {

private static final String TAG ="MyView";

public MyView(Context context) {

super(context);

}

public MyView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MyView(Context context, AttributeSet attrs,int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

    protected void onLayout(boolean changed,int left,int top,int right,int bottom) {

super.onLayout(changed, left, top, right, bottom);

Log.e(TAG,"onLayout: ");

}

@Override

    protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

Log.e(TAG,"onMeasure: ");

}

@Override

    public void computeScroll() {

super.computeScroll();

Log.e(TAG,"computeScroll: ");

}

@Override

    protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Log.e(TAG,"onDraw: ");

}

}

写完自定义控件,然后就是在我们的activity中调用 初始化view 等 然后运行会发现 执行顺序如下:

图1

其实onMeaure 、 onlayout 和ondraw 这三个方法其实 我们一般都很熟悉,但是谁能解释下computeScroll是什么鬼? 

另外 我们在computeScroll中调用invalidate 方法  如下:

图2

打印日志:会循环执行下面日志  知道activity 被destroy。

图3

下面 我们在ondraw方法中 调用invalidate() 方法 会发现,打印和上面差不多  ondraw  会一直不断的调用computeScroll()方法。   并且上面两种方式 都不会再执行 onMeasure()和onLayout()方法。

另外:postInvalidate() 与invalidate() 的区别就是postInvalidate()可以在UI 线程中执行,也可以在工作线程中执行,而invalidate()只能在Ui 线程中执行,但是从重绘速率上讲 invalidate()效果更高。

上一篇 下一篇

猜你喜欢

热点阅读