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执行缩放。这对我来说现在有意义了!