关于Android View与Drawable的问题

关于Android View与Drawable的问题


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


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


北风网解答:


1:invalidate刷新原理比较复杂 
复制代码
  1. invaliddate=>父view=>Handler=>performTraversals()=>draw()=>onDraw();
  2. /* ============================detail====================================
  3. 其继承的父views cheduleTraversals()方法向Handler发送消息
  4. viewRoot 处理其消息
  5. case DO_TRAVERSAL:
  6.          performTraversals();
  7. performTraversals()方法,调用private void draw(boolean fullRedrawNeeded)
  8. 其中含有
  9. mView.draw(canvas);
  10. 接着
  11. if (!dirtyOpaque) onDraw(canvas);  
  12. */
 
2:我就简要说明吧 
不是为了省内存,恰恰相反,原生的drawable是共享部份数据才是省内存 
其中 共享部分就是ctant state(常态) 
你想啊,N张图片用一个常态,我若想改这个值,如Alpha那么所有图片都变了,就像 
变量static变量一样了 
而使用mutate以后,会复制ctant state,drawable还是共享的,这也算是解决了低于1.5版本的一个"bug"

原文网址:http://bbs.ibeifeng.com/read-htm-tid-65331.html


更多 Android & IOS方案解决:http://bbs.ibeifeng.com/thread-htm-fid-547.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值