View的invalidate()方法
View类定义了一组方法invalidate()方法,如下:
public void invalidate()
public void invalidate(boolean invalidateCache)
public void invalidate(int l, int t, int r, int b)
public void invalidate(Rect dirty)
invalidate()方法用于重绘组件,不带参数表示重绘整个视图区域,带参数表示重绘指定的区域。追溯该方法的源码,就是将重绘请求一级级往上提交到ViewRoot,调用ViewRoot的scheduleTraversals()方法重新发起重绘请求,scheduleTraversals()方法会发送一个异步消息,调用performTraversals()方法执行重绘,而performTraversals()方法最终调用onDraw()方法。简单来说,调用View的invalidate()方法就相当于调用了onDraw()方法。onDraw()方法就是我们编写的绘图代码。
如果要刷新组件或者让画面动起来,我们只需要调用invalidate()方法即可。通过改变数据来影响绘制结果,这是实现组件刷新或实现动画的基本思路。
invalidate()方法只能在UI线程中调用,如果是在子线程中刷新组件,View类还定义了两组postInvalidate()和postInvalidateDelayed()方法,postInvalidate()方法都是实际调用相应的postInvalidateDelayed()方法,如下:
(额外引申:postInvalidateDelayed()方法最终调用的是ViewRootImpl类的dispatchInvalidateDelayed(View view, long delayMilliseconds)方法,在这个方法中使用Handler的sendMessageDelayed()方法来实现延迟的。)
public void postInvalidate()
public void postInvalidate(int left, int top, int right, int bottom)
public void postInvalidateDelayed(long delayMilliseconds)
public void postInvalidateDelayed(long delayMilliseconds, int left, int top,int right, int bottom)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-------------------last line for now-------------------