您的位置:首页 > 移动开发 > Android开发

关于Android View与Drawable的问题

2013-05-09 13:58 453 查看
原问题来自于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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: