当我从资源(drawable-long
与drawable-notlong
请求特定的drawable时,有没有人知道告诉Android系统将解析的文件夹的方法?我想确保它按照我期望的方式加载资源(例如,确保Tattoo真的是ldpi
而不是mdpi
,因为它正好在边界线上。)
我总是可以在从Resources获取drawable之后打印出drawable的内在大小,并根据我拥有的各种图像大小来检查它,但这有点痛苦。此外,我的公司允许其客户在应用程序发布之前对其进行换肤,因此在皮肤被剥离后,我将无法依赖该方法。
我尝试使用Resources.getName(resId)
但是没有提供文件夹名称,据我所知,您可以获得资源的AssetFileDescriptor
,但是您无法获得实际的文件名。< / p>
更新
自从提出此问题以来,我发现您可以通过Configuration
和DisplayMetrics
类(均可通过getResources()
访问)访问许多resource qualifier names。 DisplayMetrics
可以为您指定ldpi
/ mdpi
/ hdpi
,Configuration
可以为您small
/ normal
/ { {1}}屏幕尺寸,large
/ long
宽高比,区域设置,移动网络代码和其他硬件信息。但是,如果您拥有复杂的资源集,这仍然无法确定您是否获得了预期的资源。它也不能保护您免受报告错误值的错误的影响,例如notlong
报告错误DisplayMetrics
和xdpi
的摩托罗拉Droid错误(报告96dpi,其中实际值更高)像265dpi!可怕的虫子。)。
答案 0 :(得分:4)
另一种方法是使用两个不同的图像,名称相同,红色在另一个资源文件夹中为蓝色。当它膨胀时,你将能够看到它来自哪一个。
如果你真的想发疯,可以为每个文件夹制作一张“ldpi”或“xhdpi”等图片,当你开始你的项目时,你可以注意到你想要明确测试的每个设备出现了哪些。< / p>
从Mark Allison开始,同样的想法,但是带有包含其所在桶名称的字符串的values目录 - 它比创建图像要省力!
答案 1 :(得分:0)
我知道,您写道,您可以浏览所有资源并将大小与位图大小进行比较。但我不知道,如果你认为我的方式与我一样,那么这可能对你或其他人有所帮助。
所以这就是我做的方式。首先,我为所有可绘制图像加载大小(以字节为单位)。
String defType = "drawable";
String drawableDirPrefix = "res/drawable";
SparseArray<SparseArray<String>> resourceDirs = new SparseArray<SparseArray<String>>();
ZipInputStream apk = null;
try {
apk = new ZipInputStream(new FileInputStream(getPackageResourcePath()));
ZipEntry entry = null;
while ((entry = apk.getNextEntry()) != null) {
String resourcePath = entry.getName();
if (resourcePath.startsWith(drawableDirPrefix)) {
int firstSlashPos = resourcePath.indexOf('/');
int lastSlashPos = resourcePath.lastIndexOf('/');
int dotPos = resourcePath.lastIndexOf('.');
String resourceDir = resourcePath.substring(firstSlashPos + 1, lastSlashPos);
String resourceName = resourcePath.substring(lastSlashPos + 1, dotPos);
int resourceId = getResources().getIdentifier(resourceName, defType, getPackageName());
int resourceSize = (int) entry.getSize();
SparseArray<String> resourceInfo = resourceDirs.get(resourceId);
if (resourceInfo == null) {
resourceInfo = new SparseArray<String>();
resourceInfo.append(resourceSize, resourceDir);
resourceDirs.append(resourceId, resourceInfo);
} else {
resourceInfo.append(resourceSize, resourceDir);
}
}
}
} catch (IOException e) {
Log.e("tag", "Error", e);
} finally {
if (apk != null) {
try {
apk.close();
} catch (IOException e) {
Log.e("tag", "Error", e);
}
}
}
然后,当我想知道文件夹时,我可以将位图大小与加载的大小进行比较。
InputStream bitmapStream = null;
try {
int bitmapId = R.drawable.icon;
bitmapStream = getResources().openRawResource(bitmapId);
int bitmapSize = bitmapStream.available();
String bitmapDir = resourceDirs.get(bitmapId).get(bitmapSize);
Log.i("tag", bitmapDir);
} catch (Exception e) {
Log.e("tag", "Error", e);
} finally {
if (bitmapStream != null) {
try {
bitmapStream.close();
} catch (IOException e) {
Log.e("tag", "Error", e);
}
}
}
嗯,这只有在图像大小不同时才有效。或者你可以比较其他东西,比如宽度,高度等。
可能不是,你在寻找什么,但至少它满足了我的需求。