关于View的invalidate()方法的理解
问题:如果我调用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()效果更高。