【Android Drawable系列】- Other单个Dra
单个Drawable的使用,与shape的使用率相比其他的资源文件使用频率不太高,所以就合并到一块了。其中包括:Bitmap
,Inset Drawable
,Clip Drawable
,Scale Drawable
。
Bitmap
Bitmap也就是位图,如果要讲这个,我一定是说不清楚的。这里要讲的是资源文件中的Bitmap文件,例如:.png
、.jpg
或者.gif
图都属于Bitmap文件。图片文件不多了,用法都很熟悉,要讲的是xml中的bitmap标签。
这是
API 28
能联想出来的所有属性,其中tileModeX
和tileModeY
需要drawable-v21
目录中使用,autoMirrored
是drawable-v19
,mipMap
是drawable-v18
。
概览
<?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"] //当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。
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"]//启用或停用 mipmap 提示,v18属性
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] //定义平铺模式
/>
android:src
为必须属性
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 | 水平和垂直重复着色器的图像,交替镜像图像以使相邻图像始终相接。 |
示例代码:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:tileMode="mirror"
android:src="@drawable/icon"/>
这是mirror
属性的效果
这是repeat
属性的效果
这是clamp
属性的效果,像是把边缘的颜色拉伸的感觉
Nine-Patch
Nine-Patch
也就是俗称的.9
图,.9
图是可以拉伸区域的.9.png
文件,允许根据内容调整图像大小。通常使用.9
图的View
会将宽高属性设置为warp_content
,以便VIew
适应内容扩展大小。
与Bitmap使用方式一样,可以直接使用也可以在xml定义资源引用。直接看看使用
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/icon9"/>
与bitmap相同
android:src
为必须属性。
Inset Drawable
直译的意思就是插入Drawable,可以在其他指定的Drawable周围插入距离的一种Drawable。这么说可能不太好理解,看图
图中的两个方形这是的都是TextView
的背景,但是第一个方形的左边和上边还留有空白,这就是使用inset
标签做到的,可以在背景上增加边距,xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="10dp"
android:insetTop="20dp"
android:drawable="@drawable/ic_launcher_background">
</inset>
inset
所支持的属性如下:
- android:insetLeft="integer",左边插入边距
- android:insetTop="integer",上边插入边距
- android:insetRight="integer",右边插入边距
- android:insetBottom="integer",底边插入边距
- android:inset="integer",插入边距,同时作用于以上四边,会被上面的属性覆盖,在
drawable-v21
中使用
其实
inset
标签还支持其他的Drawable资源使用,可以直接在<inset></inset>
之间通过创建所支持的标签的方式使用Drawable资源。
Clip drawable
在xml文件中定义一个可以对其他drawable对象进行裁剪的drawable对象。直接看xml属性:
<?xml version="1.0" encoding="utf-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:clipOrientation=["horizontal" | "vertical"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical"
|"fill_vertical" | "center_horizontal" | "fill_horizontal" |"center" | "fill" | "clip_vertical"
|"clip_horizontal"] />
android:clipOrientation
控制裁剪的方向
值 | 说明 |
---|---|
horizontal | 水平裁剪可绘制对象。 |
vertical | 垂直裁剪可绘制对象。 |
android:gravity
的属性值太多了,并没有逐个尝试。下面是尝试写的一个例子:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="horizontal"
android:gravity="center"
android:drawable="@drawable/ic_launcher_background"/>
可以实际并没有任何效果,还需要在代码中使用ClipDrawable
的setLevel
方法做相应处理
注:默认级别为 0,即完全裁剪,使图像不可见。当级别为 10000 时,图像不会裁剪,而是完全可见。
ImageView imageView = findViewById(R.id.inset);
ClipDrawable clipDrawable = (ClipDrawable) imageView.getDrawable();
clipDrawable.setLevel(1000);
具体效果过如下:
Scale drawable
可以改变其他Drawable对象尺寸的一种Drawable对象。xml属性:
<?xml version="1.0" encoding="utf-8"?>
<scale
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:scaleHeight="percentage"//高度缩放的百分比,可是必须是xx%
android:scaleWidth="percentage"//宽度度缩放的百分比,可是必须是xx%
/>
这标签,差点没弄出来,用法和Clip drawable有点类似,先使用xml在通过对应的ScaleDrawable
的setLevel
方法来控制显示。xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/icon"
android:scaleGravity="center_vertical|center_horizontal"
android:scaleHeight="80%"
android:scaleWidth="80%"/>
java代码
ImageView imageView = findViewById(R.id.inset);
ScaleDrawable drawable = (ScaleDrawable) imageView.getDrawable();
drawable.setLevel(1);
具体效果过如下:
总结
到此,单个的Drawable资源标签就这些了。经常使用的标签会比较详细的尝试和记录,不常用的标签很多属性的细节没有一个一个去试想过了,以后有用到的的时候在进行研究。下篇文章就开始多个Drawable的标签用法了(要死的赶脚T_T!)。