理论教育 Android中Drawable对象的优化技巧

Android中Drawable对象的优化技巧

时间:2023-06-19 理论教育 版权反馈
【摘要】:Android中的Drawable对编写程序是非常有用的,Drawable通常是一个与View相关的画图容器。在Android引用程序中,Drawables允许不需要继承就可以很容易的定制widgets渲染。Android应用程序和widgets可以随时使用该Drawable对象而无需太关心Drawable的优化问题。这是因为在Android的核心框架中大约有700个Drawable被使用。在这个状态内,根据我们使用的不同Drawable对象而不同,但是它通常包括一个资源所有的属性。但是尽管如此,在开发过程中还是需要注意Drawable对象的优化细节问题。

Android中Drawable对象的优化技巧

Android中的Drawable对编写程序是非常有用的,Drawable通常是一个与View相关的画图容器。例如一个BitmapDrawable用于显示图片,一个ShapeDrawable用于实现画图操作并实现图像的渐变,甚至可以通过它来渲染创建的图形。

在Android引用程序中,Drawables允许不需要继承就可以很容易的定制widgets渲染。Android应用程序和widgets可以随时使用该Drawable对象而无需太关心Drawable的优化问题。这是因为在Android的核心框架中大约有700个Drawable被使用。正是因为它是如此广泛的被使用,所以Android官方对它进行优化。例如,当每一次创建一个按钮时,一个新的Drawable就会被装载,这就意味着应用程序中所有的使用不同Drawable对象实现不同背景的按钮,所有的Drawable对象共用一个公用的状态,我们称这个状态为“constant state”(常态)。在这个状态内,根据我们使用的不同Drawable对象而不同,但是它通常包括一个资源所有的属性。以按钮为例,常态包括一个位图。如此,所有按钮就可以共享一张位图,这将会节省很多的资源。但是尽管如此,在开发过程中还是需要注意Drawable对象的优化细节问题。例如下面的图6-10介绍了设置一张图给两个不同View作为背景的创建过程。正如所看到的那样,创建两个Drawable后,共享公共的部分是同一张位图。

上述“状态分享”特点极大地避免了内存浪费的情况,但是当我们试图去修改Drawable的属性时会导致一些问题。假设有一段实现关于图书列表的应用程序,在书名之后通过透明度的星号来显示用户对图书的评价。为了达到不同透明度星号的效果,可以在Adapter中编写方法getView:

978-7-111-51616-3-Part02-386.jpg

图6-10 一张图给两个不同View作为背景

978-7-111-51616-3-Part02-387.jpg

但是不幸的是,上述代码会有一个很奇怪的结果,所有的Drawable对象都会有相同的透明值。这种结果可以constant state来解释,因为当从一个list item(列表条目)中获取一个drawable对象时,constant state是一样的,对BitmapDrawable来说,透明值就是一个常态,因此对于改变一个Drawable对象实例的透明值来说,会改变所有其他对象的透明值。在Android 1.5或者更好的设备上,可以通过方法mutate()很容易地解决这个问题。当我们对一个Drawable对象调用这个方法时,Drawable对象会被复制而不会影响其他对象。在此记住Bitmap对象依旧是被重用的,即使使用的是mutate(),下面的图6-11说明了调用mutate()对象之后的情况。(www.daowen.com)

978-7-111-51616-3-Part02-388.jpg

图6-11 调用mutate()对象后

接下来更新一下我们的代码:

978-7-111-51616-3-Part02-389.jpg

为了方便方法mutate()返回的是Drawable对象自己,这就允许我们采用链的方法调用,它不会产生新的对象,通过上面的代码片段,程序行为会变得正常。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈