Android支持三种位图格式:.png(推荐使用)、.jpg(可以接受)、.gif(不推荐)。
你可以使用位图文件的文件名作为资源ID来直接引用位图文件,也可以在XML中定义一个资源别名。
注意:在程序build的过程中位图文件会被aapt工具自动无损压缩来优化。比如,如果一个全彩的PNG图片所需要的色彩不超过256色,aapt工具就会使用一个调色板来将该图转换成一张8位的PNG图。画面质量并没有变化,但是所需的存储空间却减少了。因此,要注意到在build的过程中这个目录下的图片的二进制数据会发生变化。如果你打算使用比特流的方式读取图片来转换成位图资源,请将这些图片放在res/raw/目录下。在/res/raw/目录下的图片不会被优化。
当我们将图片文件放在res/drawable/目录下时,Android就会为每一张图片创建一个Drawable资源。这些资源最终将被编译成BitmapDrawable对象。在Java代码中,通过R.drawable.filename的形式引用这些资源;在XML中,使用@[package]:drawable/filename的形式来引用。
例:
比如我们有一张图片存放为res/drawable/myimage.png,下面这个布局文件将该图片应用到一个View组件上:
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/myimage" />
而下面的代码则是以Drawable的形式来获取图像:
Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
XML Bitmap
XML Bitmap是定义在XML文件当中,指向一个位图文件的资源。这样就为原生的位图文件起了一个别名。在XML定义时可以为位图定制诸如图像抖动或是平铺等额外属性。
我们可以使用<bitmap>节点作为<item>节点的子节点。比如,当我们要创建一个state list 或者 layer list时,可以不在<item>节点使用android:drawable属性而是将一个<bitmap>节点嵌入到<item>节点当中来定义drawble引用。
XML Bitmap最终将被编译成BitmapDrawable对象。在Java代码中通过R.drawable.filename的形式访问,在XML当中使用@[package:]drawable/filename的形式来访问。
XML bitmap语法:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
android:antialias——开启或关闭抗锯齿
android:dither——开启或关闭图像抖动(如果位图与显示屏幕的像素配置不相同时会用到,比如一张ARGB 8888位图和一个RGB565的显示屏)
android:filter——开启或关闭滤镜。当收缩或是拉伸位图时使用这个来使位图看上去更平滑。
android:gravity——当位图大小比它所在的容器小的时候,使用这个属性来决定位图在容器中的位置。可取的值有:top、bottom、left、right、center_vertical、fill_vertical(纵向缩放位图使之与容器等高)、center_horizontal、fill_horizontal(横向缩放位图使之与容器等宽)、center、fill(纵向与橫向都缩放使之完全铺满容器,这也是默认值)、clip_vertical(呃。。。)、clip_horizontal(呃。。。)。
android:tileMode——定义平铺模式。如果定义了,那么位图将会重复,并且Gravity属性将失效。可取的值有disabled(默认值,不启用平铺)、clamp(复制位图边缘的颜色来填充容器剩下的空白部分)、repeat(复制整个位图来填充容器)、mirror(与repeat类似,但是是交替的镜像复制,即相邻的两张是镜像对称的)
比如:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/b4"
android:tileMode="mirror"
/>