关于Android View与Drawable的问题

问答小助手 2013-05-09 02:17:32
加精
原问题来自于CSDN问答频道,更多解决方案见:http://ask.csdn.net/questions/2497

问题描述:

调用View.invalidate()方法,就会请求View重新draw()。可是我看了invalidate()与相关的方法,并没有与draw()有直接的关系。请问invalidate()是如何使View重新draw()的?

Drawable.mutate()方法为了不产生新的对象,直接返回了它自身。既然是这样,那为什么mutate()以后同一个图像资源能够有不同的常态(比如透明度)?在BitmapDrawable中在第一次mutate()的时候新生成一个BitmapState常态,后面的就是直接返回它自身了。第一次常态对象改变了倒还可以理解,可后面的我就不明白了。求高人解惑,非常感谢!

解决方案:

1:invalidate刷新原理比较复杂

invaliddate=>父view=>Handler=>performTraversals()=>draw()=>onDraw();
/* ============================detail====================================
其继承的父views cheduleTraversals()方法向Handler发送消息
viewRoot 处理其消息
case DO_TRAVERSAL:
performTraversals();
performTraversals()方法,调用private void draw(boolean fullRedrawNeeded)
其中含有
mView.draw(canvas);
接着
if (!dirtyOpaque) onDraw(canvas);
*/


2:不是为了省内存,恰恰相反,原生的drawable是共享部份数据才是省内存
其中共享部分就是constant state(常态)
你想啊,N张图片用一个常态,我若想改这个值,如Alpha那么所有图片都变了,就像
变量static变量一样了
而使用mutate以后,会复制constant state,drawable还是共享的,这也算是解决了低于1.5版本的一个"bug"
...全文
691 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mbugaifc 2013-05-15
  • 打赏
  • 举报
回复
u010693647 2013-05-14
  • 打赏
  • 举报
回复
谢谢分享啊~
beienwang 2013-05-13
  • 打赏
  • 举报
回复
好帖子,学习了!
fangyinlong 2013-05-11
  • 打赏
  • 举报
回复
好帖子,学习了!
380725436 2013-05-11
  • 打赏
  • 举报
回复
很实用,不错。
AnnaRegina 2013-05-10
  • 打赏
  • 举报
回复
刚开始学android感觉帖子不错,支持一下!希望多多发贴
fdhfghfghb 2013-05-09
  • 打赏
  • 举报
回复
评论一个试一试
柯sea 2013-05-09
  • 打赏
  • 举报
回复
支持一个先哦
手托着世界 2013-05-09
  • 打赏
  • 举报
回复
支持一个先,管他呢!!!!!!!!!!!!!!!! 。
u010632518 2013-05-09
  • 打赏
  • 举报
回复
评论有没有积分啊

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧