自定义View重绘使requestLayout, invalidate和postInvalidate的异同
2016-07-01 11:21
369 查看
自定义View在项目中用的很频繁,很多时候Android提供给我们的原有控件无法满足我们的需求,此时自定义View应运而生
当我们在代码中对自定义View进行了设置使,需要重绘View
我们谈论一下自定义View的重绘问题
1、android中实现view的更新有几种方法?
其一是invalidate,Android中源码解释如下
另一种是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上时,这时候适合调用这个方法。
该方法必须在主线程中执行。
当我们在代码中对自定义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上时,这时候适合调用这个方法。
该方法必须在主线程中执行。
相关文章推荐
- UGUI Text组件实际文本宽高的获取
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
- tableView设置UITableViewStyleGrouped顶部有空余高度
- Starting MySQL...The server quit without updating PID file
- UIToolBar barItem的位置
- 启动安卓模拟器报错 emulator: ERROR: x86_64 emulation currently requires hardware acceleration! CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1) 解决办法
- 在iOS8中使用UIAlertController
- Android Studio 运行时出现 finished with non-zero exit value 2 错误分析
- #150 – An Example of Using PropertyChanged and CoerceValue Callbacks(PropertyChanged和CoerceValue例子)
- 让UITableView的section header view不悬停的方法
- UIViewController 间的传值方式
- 19 C#循环语句的跳过和中断 continue和break
- indent guides 格式化代码(添加竖线)
- ios开发之uiTableView增加搜索框
- android stuido You can quickly navigate in the currently edited file with Ctrl+F12 (Navigate | File
- CUICatalog: Invalid asset name supplied:
- fuel8:fuel master安装失败的处理
- NGUI 背包系统的拖拽
- Your build settings specify a provisioning profile with the UUID, no provisioning profile was found
- UIButton的titleLabe setAttributeSting 首次不起作用