Drawable Resource也即可绘制对象资源,是指可在屏幕上绘制的图形,以及可以使用getDrawable(int)等api检索或者应用到具有android:drawable和android:icon等属性的其他xml资源的图形,共有多种不同类型的可绘制对象:
BitmapDrawable(位图文件)
位图文件也即是最简单的可绘制资源,Android支持三种格式的文图文件:.png(首选) 、.jpg(可接受) 、.git(不建议)
您可以使用文件名作为资源ID直接引用位图文件,也可以在xml中创建别名资源ID。
注:在构建过程中,可通过 aapt工具自动优化位图文件,对图像进行无损压缩。例如,不需要超过 256 色的真彩色 PNG 可通过调色板转换为 8 位 PNG。这样产生的图像质量相同,但所需内存更少。因此请注意,此目录中的图像二进制文件在构建时可能会发生变化。如果您计划将图像解读为比特流以将其转换为位图,请改为将图像放在 res/raw/文件夹中,在那里它们不会进行优化。
在xml中定义:
<?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:mipMap=["true" | "false"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
xmlns:android
字符串,定义命明空间其必须是是 "http://schemas.android.com/apk/res/android"
。这仅当 <bitmap>是根元素时才需要,当 <bitmap>嵌套在 <item>内时不需要。
android:src
引用图片资源或者其他的Drawable Resource
android:antialias
启用(true)或停用(false)抗锯齿,不明白抗锯齿含义的同学可以去百度下加深理解。下图是未作抗锯齿处理和做了抗锯齿处理的对比图。一目了然!开启抗锯齿功能会让图片变的平滑,同时也会在一定程度上降低图片的清晰度,但是这个降低的幅度较低以至于可以忽略,因此抗锯齿选项应该开启。
android:dither
图像的抖动处理,当每个颜色值以低于8位表示时,对应图像做抖动处理可以实现在可显示颜色总数比较低(比如256色)时还保持较好的显示效果,所以抖动选项也应该开启。这里举个例子:
未做抖动处理
做过抖动处理
做过抖动处理的图片效果明显比没做过抖动处理的效果图要柔和些。
android:filter
启用或停用位图过滤。当位图收缩或拉伸以使其外观平滑时使用过滤。开启过滤效果可以保持较好的现实效果。所以位图过滤选项应该开启。
android:mipMap
这时一种图像相关的处理技术,也叫纹理映射,比较抽象。默认值为false,日常用的很少,所以这里就不做介绍了。
android:tileMode
关键字。定义平铺模式。当平铺模式启用时,位图会重复。gravity属性在平铺模式启用时将被忽略。
必须是以下常量值之一:
disabled 不平铺位图。这是默认值。
clamp 当着色器绘制范围超出其原边界时复制边缘颜色
repeat 水平和垂直重复着色器的图像。
mirror 水平和垂直重复着色器的图像,交替镜像图像以使相邻图像始终相接。
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src = "@mipmap/ic_launcher"
android:tileMode = ["disabled" | "clamp" | "repeat" | "mirror"]>
</bitmap>
布局文件为:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.ziv.myapplication.MainActivity">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_test" />
</RelativeLayout>
下面看下具体的效果:水平和竖直方向的平铺
默认状态下 android:tileMode = "disabled"
android:tileMode = "disabled"
android:tileMode = "repeat"
android:tileMode = "mirror"
android:tileMode = "clamp"
android:tileModeX: 设置x方向上的平铺方式
android:tileModeY: 设置y方向上的平铺方式
**android:alpha: 设置图片的透明度0.0-1.0之间
android:gravity
取值如下:
top 将对象放在其容器顶部,不改变其大小。
bottom 将对象放在其容器底部,不改变其大小。
left 将对象放在其容器左边缘,不改变其大小。
right 将对象放在其容器右边缘,不改变其大小。
center_vertical 将对象放在其容器的垂直中心,不改变其大小。
fill_vertical 按需要扩展对象的垂直大小,使其完全适应其容器。
center_horizontal 将对象放在其容器的水平中心,不改变其大小。
fill_horizontal 按需要扩展对象的水平大小,使其完全适应其容器。
center 将对象放在其容器的水平和垂直轴中心,不改变其大小。
fill 按需要扩展对象的垂直大小,使其完全适应其容器。这是默认值。
clip_vertical 可设置为让子元素的上边缘和/或下边缘裁剪至其容器边界的附加选项。裁剪基于垂直重力:顶部重力裁剪上边缘,底部重力裁剪下边缘,任一重力不会同时裁剪两边。
clip_horizontal 可设置为让子元素的左边和/或右边裁剪至其容器边界的附加选项。裁剪基于水平重力:左边重力裁剪右边缘,右边重力裁剪左边缘,任一重力不会同时裁剪两边。