有没有办法告诉可绘制资源从哪个文件夹膨胀?

时间:2010-06-16 11:55:49

标签: android

当我从资源(drawable-longdrawable-notlong请求特定的drawable时,有没有人知道告诉Android系统将解析的文件夹的方法?我想确保它按照我期望的方式加载资源(例如,确保Tattoo真的是ldpi而不是mdpi,因为它正好在边界线上。)

我总是可以在从Resources获取drawable之后打印出drawable的内在大小,并根据我拥有的各种图像大小来检查它,但这有点痛苦。此外,我的公司允许其客户在应用程序发布之前对其进行换肤,因此在皮肤被剥离后,我将无法依赖该方法。

我尝试使用Resources.getName(resId)但是没有提供文件夹名称,据我所知,您可以获得资源的AssetFileDescriptor,但是您无法获得实际的文件名。< / p>

更新 自从提出此问题以来,我发现您可以通过ConfigurationDisplayMetrics类(均可通过getResources()访问)访问许多resource qualifier namesDisplayMetrics可以为您指定ldpi / mdpi / hdpiConfiguration可以为您small / normal / { {1}}屏幕尺寸,large / long宽高比,区域设置,移动网络代码和其他硬件信息。但是,如果您拥有复杂的资源集,这仍然无法确定您是否获得了预期的资源。它也不能保护您免受报告错误值的错误的影响,例如notlong报告错误DisplayMetricsxdpi的摩托罗拉Droid错误(报告96dpi,其中实际值更高)像265dpi!可怕的虫子。)。

2 个答案:

答案 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);
        }
    }
}

嗯,这只有在图像大小不同时才有效。或者你可以比较其他东西,比如宽度,高度等。

可能不是,你在寻找什么,但至少它满足了我的需求。