9

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

BitmapDrawable bitmapDrawable = new BitmapDrawable(res, bmap);

res一般在哪里getResources()

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

4

3 回答 3

6

为什么构造函数需要它?

来自以下文档BitmapDrawable(Resources res, Bitmap bitmap)

从位图创建可绘制对象,根据资源的显示指标设置初始目标密度。

因此,为了使用显示指标设置初始目标密度,这是必需的,并且DisplayMetrics将从Resources您提供的参数中获取BitmapDrawable.

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

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

如果我自己已经对Bitmap进行了缩放,为什么BitmapDrawable需要资源?

怎么BitmapDrawable知道,你已经缩放了Bitmap?通常,如果您正在创建一个BitmapDrawable,您不应该自行扩展它,这就是 API 以这种方式设计的原因。

将位图转换为可绘制对象时避免缩放的唯一方法似乎是使用不推荐使用的构造函数?

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

我已经挖掘了一些资源,并在课堂上发现了这段代码Bitmap

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)

如果您明确将密度设置BitmapDENSITY_NONE怎么办?然后if检查将评估为true并且不会执行缩放。

Bitmap bitmap = ...
bitmap.setDensity(Bitmap.DENSITY_NONE);

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

于 2017-07-24T18:38:14.827 回答
3

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

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

于 2015-02-17T09:05:37.163 回答
0

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

BitmapDrawable(Resources res) /* deprecated constructor */

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

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

如果不通过构造函数传递 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)。Parcelable 对象可以包含在 Bundle 中。而Bundles是IPCS(Interprocess communication)的核心,通过各种Android Components进行通信)。

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

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

希望,我的回答对你有帮助!

于 2017-07-31T16:45:57.673 回答