`

Drawable Mutations(Android Drawable 深入分析)

阅读更多

Android's drawables对编写程序是非常有用的。A Drawable通常是一个与view相关的插件后的画图容器。例如。一个aBitmapDrawable是用来显示图片的,a ShapeDrawable 是用来画图和渐变的等等。你甚至可以通过它还创建负责的渲染。

 

Drawables允许你不需要继承就可以很容易的定制widgets渲染。事实是,Android的应用程序和widgets 是使用该drawables对象的,在android的核心框架中大约有700个drawables被使用。正式以为他是如此广泛的被使用,Android对它进行了优化。例如,每一次你创建一个按钮时,一个新的drawable就会被装载。这就意味着应用程序中所有的使用不同drawablesd对象实现不同背景的按钮,所有的drawables对象公用一个公用的状态,我们成“constant state”,这个状态的内如根据你使用的不同drawables对象而不同,但是它通常包括一个资源所有的属性。以按钮为例,常态包括一个位图。如此一所有按钮就可以共享一张位图。这将会节省很多的资源。

 

下面的图介绍了你设置一张图给两个不同View作为背景的创建过程。正如你所看到的那样,两个drawables被创建,但是共享公共的部分也就是同一张位图。


 

这种状态分享特点极大避免了浪费内存,但是当你试图去修改drawable的属性时它会导致一些问题。假设是关于书的的列表的程序,书名之后会当你标注为喜欢的时候显示为不透明的而标注不喜欢的时候完全透明星星。为了达到这样的效果,你也许会在你的adapter个getView实现下面的方法:

 

Book book = ...;
TextView listItem = ...;
 
listItem.setText(book.getTitle());
 
Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
    star.setAlpha(255); // opaque
} else {
    star.setAlpha(70); // translucent
}

 不幸的是,上面的那段代码会有一个很奇怪的结果,所有的drawables对象都会有相同的透明值。



 

这种结果能够用上面的“常态”来解释。因为我们从一个list item中获取一个drawable对象时,constant state是一样的,对BitmapDrawable来说,透明值就是一个常态,因此,改变一个drawable对象实例的透明值来说,会改变所有其他对象的透明值,更糟糕是,这种问题在1.1和1.0的是不好解决的。

 

在1.5或者更好的设备上通过mutate()方法是很容易解决上述问题。当你对一个drawable对象调用这个方法时,drawable对象就会被复制而不会印象其他对象。记住bitmap对象依旧是被重用的,即使是实用mutate(),下面这幅图说明调用mutate()对象之后情况:



 

让我更新一下我们的代码:

if (book.isFavorite()) {<br>
    star.mutate().setAlpha(255); // opaque<br>
} else {<br>
    star. mutate().setAlpha(70); // translucent<br>
}

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



 

 建议使用Drawable而非Bitmap加载图象,使用Drawable保存图片对象占用更小的内存空间。

  • 大小: 12.8 KB
  • 大小: 23.1 KB
  • 大小: 15.9 KB
  • 大小: 22.6 KB
分享到:
评论

相关推荐

    (翻译) Android SDK文档之Drawable Mutations

    这篇博客文章可能深入解析了Android SDK文档中关于Drawable Mutations的细节。 Drawable Mutations是为了避免在不同组件间共享同一个Drawable对象时,改变其中一个组件的Drawable会影响到其他组件的显示。例如,当...

    Android-android-gif-drawable用于在Android上显示动画GIF

    本文将深入探讨如何使用`android-gif-drawable`库以及其背后的实现原理和优化策略。 `android-gif-drawable`库的核心功能是提供了一个名为`GifDrawable`的类,它可以解析GIF文件并将其转换为Android可绘制对象...

    android中的drawable集合

    在Android开发中,Drawable是图形和图像处理的重要组成部分,它是一种可以绘制到Canvas上的对象,广泛用于界面元素的装饰和状态表示。以下是对Android中drawable集合的详细解释: 1. **Bitmap Drawable**: Bitmap ...

    android资源图片浏览,系统图片,android.R.drawable浏览,查看系统图片,查看android自带图片

    本篇文章将深入探讨如何浏览和使用Android系统中的图片资源,特别是`android.R.drawable`中的资源。`android.R.drawable`是Android SDK提供的一个预定义的资源集合,包含了大量的图标和图形,适用于各种UI组件和状态...

    android 通过图片名称获取 drawable 目录下的图片

    ### Android 通过图片名称获取 Drawable 目录下的图片 在Android开发过程中,有时我们需要动态地根据图片名称来加载Drawable资源。这种需求虽然不常见,但在某些特定场景下却显得尤为重要,比如实现一个自定义控件...

    Android drawable 三角形

    drawable实现三角形,原博客地址:https://blog.csdn.net/u010356768/article/details/76040972#comments 大家去原博客地址看下就知道了。不用下载浪费积分

    Android所有系统资源图标android.R.drawable.xxx查看软件

    Android所有系统资源图标android.R.drawable.xxx查看软件 源码地址:http://blog.csdn.net/dianyueneo/article/details/7197067

    Android中Drawable分类汇总

    在Android开发中,Drawable是用于绘制图形的资源,它们被广泛应用于各种界面元素的背景或图片显示。Drawable资源是抽象的图形对象,可以包括图片、颜色、渐变等多种形式。在Android SDK中,开发者通常不需要直接操作...

    Android Drawable 各种高效用法

    在Android开发中,Drawable是图形资源的核心组成部分,用于在用户界面上绘制各种图像,如按钮、背景、图标等。理解并熟练运用Drawable的各种高效用法对于优化应用性能和提升用户体验至关重要。以下是一些关于Android...

    android.R.drawable图标查看软件

    Android系统图标android.R.drawable下的所有图标查看软件

    android安卓APP之13种Drawable位图片资源.zip_android客户端是什么

    本资源包“android安卓APP之13种Drawable位图片资源.zip”涵盖了Android开发中常见的13种Drawable类型,这些类型极大地丰富了Android应用的视觉表现和动态效果。下面将详细介绍每种Drawable的特性和用法。 1. **...

    android drawable

    在Android开发中,`Drawable`是一个非常重要的概念,它代表了可以绘制到屏幕上的图形对象。这个示例项目"android drawable"旨在展示如何在Android应用中有效地使用和显示`Drawable`资源。 `Drawable`在Android中...

    Android的Drawable学习Demo

    本篇文章将深入探讨Android的Drawable及其应用,通过一个实际的Demo来展示其功能和用法。 Drawable是Android系统提供的一种抽象类,用于表示屏幕上的图形对象。它支持多种形态,包括简单的颜色(ColorDrawable)、...

    Android高级应用源码-drawable(图片).zip

    通过分析这些源码,我们可以深入理解Android中图片处理和Drawable的高级用法,从而提升应用的性能和用户体验。 首先,Drawable是Android SDK中的一个接口,有多种实现,如BitmapDrawable、ColorDrawable、...

    Android-一个支持设置各种drawable的android库可直接在layout.xml中查看

    Android开发中的drawable资源是构建用户界面不可或缺的一部分,它们可以是颜色、形状、图像或图层列表等。在传统的Android开发中,我们通常在代码中动态设置drawable或者在XML布局文件中硬编码引用它们。然而,...

    android drawable下的xml详解

    ### Android Drawable 下的 XML 详解 #### 一、概述 在Android开发中,`drawable`是一种非常重要的资源类型,主要用于存放应用所需的图形图像资源。这些资源可以被用于UI设计、图标绘制等多种场景。通常,开发者会...

    Android Drawable 全部 xml 元素和属性用法

    本篇将深入探讨Android Drawable XML元素和属性的用法。 1. **Drawable XML概述** Android的Drawable XML允许开发者在代码之外定义图形对象,如颜色、形状、位图等,以提高可维护性和重用性。XML文件通常存放在res...

    Drawable的基础demo

    在Android开发中,`Drawable`是一个非常重要的概念,它代表了屏幕上的图形对象,可以是图像...在这个"Drawable基础Demo"中,你可以通过实际操作,深入了解`Drawable`的各种特性和用法,为你的Android开发技能添砖加瓦。

    Android自定义Drawable的代码例子

    在Android开发中,Drawable是图形和图像的基本元素,它用于绘制视图的背景、按钮、图标等。系统提供了多种预定义的Drawable类型,如Shape、BitmapDrawable等,但有时我们可能需要实现更复杂的视觉效果,这时就需要...

    Android Drawable Bitmap 相互转换

    在Android开发中,Drawable和Bitmap是两种常用的图像资源类型,它们各有特点且在不同场景下有不同的优势。了解和掌握它们之间的相互转换对于优化性能和提高用户体验至关重要。本篇将详细介绍如何在Android中进行...

Global site tag (gtag.js) - Google Analytics