第一次写文章,主要是分享一下,在网上搜索了很久发现没有相关文章,有不好的地方请大家指出。
从 Android 开发者官网 得知到资源别名的使用。
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/icon_ca" />
如果将此文件另存为 icon.xml(例如,在备用资源目录中,另存为 res/drawable-en-rCA/),则会编译到可作为 R.drawable.icon 引用的资源中,但实际上它是 R.drawable.icon_ca 资源(保存在 res/drawable/ 中)的别名。
今天工作的时候需要在平板使用 xxxhdpi 的图片,所以为了复用资源,使用这种方式来复用图片。原图片放在 drawable 文件夹中,结果在 xhdpi 的手机上测试发现 Bitmap 比原图大了两倍,经过一段时间的阅读源码,发现
Context.getDrawable() 如果是 xml 的资源最终还是会通过 BitmapFactory 来 decode 图片,结果从 src 解析的图片位于 drawable 下(推测该默认文件的 density 为160),手机 density 为 320,从而被放大了 320/160 = 2倍。
解决方法:如果在 drawable-hpi 这类适配的文件中使用资源别名,请将原图放在 drawable-nodpi 中。
途中发现的一些问题:
1.硬件加速开启的情况下,如果 Bitmap 太大,会触发硬件加速对 Bitmap 大小的限制,无法显示图片,也没有
Crash, 只有 warn 级别的 Logcat。而且每个手机对其的限制都不一样。
OpenglRender : Bitmap too large to be uploaded into a texture (440x6405, max=4096x4096)
2.这种使用方式如果再次用在类似的 XML 资源文件中,会无法找到资源而抛出 NotFoundException。比如
<layer-list>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/icon" />
</layer-list>