由于不推荐使用无参数BitmapDrawable
构造函数,我们必须为构造函数提供资源ID。
BitmapDrawable bitmapDrawable = new BitmapDrawable(res, bmap);
res
通常为getResources()
。
为什么构造函数需要它,如果我们使用通用图像缓存,我们如何定义该值?
答案 0 :(得分:5)
为什么构造函数需要它?
来自BitmapDrawable(Resources res, Bitmap bitmap)
的文档:
从位图创建drawable,根据资源的显示指标设置初始目标密度。
因此,需要使用显示指标设置初始目标密度,DisplayMetrics
将从您提供的Resources
中提取BitmapDrawable
BitmapDrawable
}。
抱歉,无法理解这个问题。你能改写一下吗?如果我们使用通用图像缓存,我们如何定义该值?
如果我自己已经缩放位图,为什么 BitmapDrawable 需要资源?
Bitmap
怎么知道你已经缩放了BitmapDrawable
?通常情况下,如果您要创建ChangeBounds
,则不应该自己进行扩展,这就是API的设计原因。
将位图转换为 Drawable 时,避免缩放的唯一方法是使用不推荐使用的构造函数吗?
虽然听起来很糟糕,但您可以看到转换框架中的类如何使用该构造函数,例如: 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)
这在以下链中被调用:
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-ldpi
,drawable-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
希望,我的回答可以帮到你!