您的位置:首页 > 产品设计 > UI/UE

自定义View重绘使requestLayout, invalidate和postInvalidate的异同

2016-07-01 11:21 369 查看
自定义View在项目中用的很频繁,很多时候Android提供给我们的原有控件无法满足我们的需求,此时自定义View应运而生

当我们在代码中对自定义View进行了设置使,需要重绘View

我们谈论一下自定义View的重绘问题

1、android中实现view的更新有几种方法?

其一是invalidate,Android中源码解释如下

/**
* Invalidate the whole view. If the view is visible,
* {@link #onDraw(android.graphics.Canvas)} will be called at some point in
* the future.
* <p>
* This must be called from a UI thread. To call from a non-UI thread, call
* {@link #postInvalidate()}.
*/
public void invalidate() {
invalidate(true);
}


另一种是postInvalidate

其中前者是在UI线程自身中使用,而后者在非UI线程中使用。

Android提供了invalidate方法实现界面刷新,但是invalidate不能直接在子线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。所以,如果要使用invalidate的刷新(在子线程中),那我们就得配合handler的使用,使异步非ui线程转到ui线程中调用,如果要在非ui线程中直接使用就调用postInvalidate方法即可,这样就省去使用handler的烦恼。

2、requestLayout在什么时候用呢?

当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view(父类的视图)重新调用他的onMeasure onLayout来重新设置自己位置。特别是当view的layoutparameter发生改变,并且它的值还没能应用到view上时,这时候适合调用这个方法。

该方法必须在主线程中执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: