Android “什么是”呢;资源“;在BitmapDrawable构造函数中真的吗?

Android “什么是”呢;资源“;在BitmapDrawable构造函数中真的吗?,android,android-resources,android-drawable,android-bitmap,bitmapdrawable,Android,Android Resources,Android Drawable,Android Bitmap,Bitmapdrawable,由于无参数的BitmapDrawable构造函数已被弃用,我们必须为构造函数提供资源id BitmapDrawable bitmapDrawable = new BitmapDrawable(res, bmap); 其中res通常是getResources() 为什么构造函数需要它?如果我们使用通用图像缓存,我们如何定义该值?在该构造函数中,需要getResources()来“根据资源的显示度量设置初始目标密度”。我的理解是这样的——您可以获取显示指标,其中包含有关大小、密度、字体缩放的信息,

由于无参数的
BitmapDrawable
构造函数已被弃用,我们必须为构造函数提供资源id

BitmapDrawable bitmapDrawable = new BitmapDrawable(res, bmap);
其中
res
通常是
getResources()


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

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

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

为什么构造器需要它

从以下文件:

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

因此,需要使用显示度量设置初始目标密度,
DisplayMetrics
将从作为参数提供给
BitmapDrawable
资源中获取

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

对不起,我不能理解这个问题。你能重新措辞吗

如果我自己已经缩放了位图,为什么位图绘制需要资源

BitmapDrawable
如何知道您已经缩放了
位图
?通常,如果您正在创建一个
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)
如果将
位图的密度显式设置为
密度\u NONE
,会怎么样?然后,
if
检查将计算为
true
,并且不会执行缩放

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

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

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

BitmapDrawable(Resources res) /* deprecated constructor */

BitmapDrawable(android.content.res.Resources, android.graphics.Bitmap) /* new constructor they introduced to replace above deprecated constructor */
不推荐使用的构造函数会创建一个空的可绘制对象,而不处理密度。但是,新的构造函数从位图创建drawable,根据资源的显示度量设置初始目标密度。使用新的构造函数可以为您提供位图(最终类)的所有功能

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

例如,

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 */
}
另一个想法是他们传递了位图变量(android.graphics.Bitmap),因为位图是可包裹的(如果实现了可包裹)。可包裹的对象可以包含在包中。捆绑包是IPCS(进程间通信)和通过各种Android组件进行通信的核心

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


希望我的回答能帮助你

据我从API中了解:“还可以看到Bitmap类,它处理原始位图图形的管理和转换,在绘制画布时应该使用它。”,如果在参考资料中没有定义图像,则应该使用位图而不是BitmapDrawable。似乎连
setImageBitmap
都在内部使用
BitmapDrawable
。(
ImageView.class
)谢谢您抽出时间。但是我设置了一个自定义位图,它不在res/文件夹中?谢谢您提供这些信息。我完全忽略了位图具有密度属性这一事实。默认情况下,位图的GetDensity“与当前显示的密度相同”,因此除非在位图上显式设置密度,否则不会对BitmapDrawable执行缩放。这对我来说现在有意义了!