Android技术知识

【Android Drawable系列】- Other单个Dra

2018-12-06  本文已影响11人  MrTrying
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所支持的属性如下:

其实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!)。

上一篇下一篇

猜你喜欢

热点阅读