【Android Drawable系列】- Other单个Drawable

Android Drawable系列

单个Drawable的使用,与shape的使用率相比其他的资源文件使用频率不太高,所以就合并到一块了。其中包括:BitmapInset DrawableClip DrawableScale Drawable

Bitmap

Bitmap也就是位图,如果要讲这个,我一定是说不清楚的。这里要讲的是资源文件中的Bitmap文件,例如:.png.jpg或者.gif图都属于Bitmap文件。图片文件不多了,用法都很熟悉,要讲的是xml中的bitmap标签。

这是API 28能联想出来的所有属性,其中tileModeXtileModeY需要drawable-v21目录中使用,autoMirroreddrawable-v19mipMapdrawable-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"/>

可以实际并没有任何效果,还需要在代码中使用ClipDrawablesetLevel方法做相应处理

注:默认级别为 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在通过对应的ScaleDrawablesetLevel方法来控制显示。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!)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容