BitmapDrawable构造函数中的“资源”到底是什么?

时间:2015-02-17 08:05:57

标签: android android-resources android-drawable android-bitmap bitmapdrawable

由于不推荐使用无参数BitmapDrawable构造函数,我们必须为构造函数提供资源ID。

BitmapDrawable bitmapDrawable = new BitmapDrawable(res, bmap);

res通常为getResources()

为什么构造函数需要它,如果我们使用通用图像缓存,我们如何定义该值?

3 个答案:

答案 0 :(得分:5)

  

为什么构造函数需要它?

来自BitmapDrawable(Resources res, Bitmap bitmap)的文档:

  

从位图创建drawable,根据资源的显示指标设置初始目标密度。

因此,需要使用显示指标设置初始目标密度,DisplayMetrics将从您提供的Resources中提取BitmapDrawable BitmapDrawable }。

  

如果我们使用通用图像缓存,我们如何定义该值?

抱歉,无法理解这个问题。你能改写一下吗?

  

如果我自己已经缩放位图,为什么 BitmapDrawable 需要资源?

Bitmap怎么知道你已经缩放了BitmapDrawable?通常情况下,如果您要创建ChangeBounds,则不应该自己进行扩展,这就是API的设计原因。

  

位图转换为 Drawable 时,避免缩放的唯一方法是使用不推荐使用的构造函数吗?

虽然听起来很糟糕,但您可以看到转换框架中的类如何使用该构造函数,例如: CrossfadeBitmap

我已经挖掘了一些资源,并在static public int scaleFromDensity(int size, int sdensity, int tdensity) { if (sdensity == DENSITY_NONE || tdensity == DENSITY_NONE || sdensity == tdensity) { return size; } // Scale by tdensity / sdensity, rounding up. return ((size * tdensity) + (sdensity >> 1)) / sdensity; } 类中找到了这段代码:

* BitmapDrawable#constructor
* BitmapDrawable#updateLocalState()
* BitmapDrawable#computeBitmapSize()
* Bitmap#getScaledWidth()
* scaleFromDensity(getWidth(), mDensity, targetDensity)

这在以下链中被调用:

Bitmap

如果您明确将DENSITY_NONE的密度设置为if,该怎么办?然后,true检查将评估为Bitmap bitmap = ... bitmap.setDensity(Bitmap.DENSITY_NONE); ,并且不会执行任何缩放。

$mapped_array = array();
foreach($original_array as $level1key => $level1value) {
    if (is_array($level1value)) {
        foreach($level1value as $level2key => $level2value) {
            $mapped_array[$level1key][$level2key] = checkIfValid($level2value);
        }
    } else {
        $mapped_array[$level1key] = checkIfValid($level1value);
    }
}

没有测试,只是根据来源做出假设。

答案 1 :(得分:3)

在这个构造函数中,需要“根据资源的显示度量来设置初始目标密度”的getResources()。我这样理解 - 你采用显示指标,包含有关大小,密度,字体缩放的信息,并将此信息传递给构造函数。可能如果您的res/文件夹中的图片有不同的尺寸 - 在相应的子文件夹中,例如drawable-ldpidrawable-hdpi,您将获得不同的信息。

要在图像缓存中使用它,您需要向其传递一个Context,然后像这样调用:Context ctx; ctx.getResources(); 希望有所帮助。

答案 2 :(得分:0)

关于不推荐使用的构造函数和新构造函数

BitmapDrawable(Resources res) /* deprecated constructor */

BitmapDrawable(android.content.res.Resources, android.graphics.Bitmap) /* new constructor they introduced to replace above deprecated constructor */

不推荐使用的构造函数创建一个空的drawable,而不是处理密度。但是,新构造函数从位图创建drawable,根据资源的显示指标设置初始目标密度。使用新的构造函数可以为您提供Bitmap(最终类)所具有的所有功能。 https://developer.android.com/reference/android/graphics/Bitmap.html#pubmethods

如果未通过构造函数传递Bitmap变量会发生什么? 从参数传递变量时,不需要在传递的位置创建新的位图变量。您创建了另一个变量,它只是您的Bitmap的引用(静态引用)。由于位图是大尺寸文件,因此当您传递引用时,可以节省大量空间和处理能力,而这必须使用在ImageView中加载位图。所以它可以帮助你不要OutOfMemory Exception

例如,

public void passA(String); /* method signature*/
String s = "dfsfsdf";
passA(s); /* method calling */

另一方:

public void passA(String newVar) {
   /* newVar simply points (references) to the memory of "dfsfsdf". */
   /* passing references */ /* for Bitmap creating new copy is expensive 
    operations */
/*Note: Java does manipulate objects by reference, and all object variables are references */
}

他们传递Bitmap变量(android.graphics.Bitmap)的另一个想法是因为Bitmap是Parcelable(如果实现了Parcelable)。可以在Bundle中包含Parcelable对象。捆绑包是IPCS(进程间通信)和通过各种Android组件进行通信的核心内容。

关于常规图像缓存 您可以通过新构造函数从Bitmap传递变量来设置所有必需的密度和其他内容。然后,您可以在Least Recently Used (Lru)缓存中创建HashMap,在其中定义字符串key以指出已配置的Bitmap variable。例如, LruCache 。现在,在处理器的最近最少缓存中,您已配置了位图。这样可以节省大量处理能力。

https://developer.android.com/reference/android/util/LruCache.html

希望,我的回答可以帮到你!