6daedc2b1178

Code4Android.jpg

前言

文章中内容多来自谷歌官方文档详戳,一些示例代码详戳GitHub,不喜请轻喷。

可绘制对象资源

可绘制对象资源是一般概念,是指可在屏幕上绘制的图形,以及可以使用 getDrawable(int) 等 API 检索或者应用到具有 android:drawable 和 android:icon 等属性的其他 XML 资源的图形。共有多种不同类型的可绘制对象:

位图文件

位图图形文件(.png、.jpg 或 .gif)。创建 BitmapDrawable。

九宫格文件

具有可拉伸区域的 PNG 文件,允许根据内容调整图像大小 (.9.png)。创建 NinePatchDrawable。

图层列表

管理其他可绘制对象阵列的可绘制对象。它们按阵列顺序绘制,因此索引最大的元素绘制在顶部。创建 LayerDrawable。

状态列表

此 XML 文件为不同状态引用不同位图图形(例如,按下按钮时使用不同的图像)。创建 StateListDrawable。

级别列表

此 XML 文件用于定义管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量。创建 LevelListDrawable。

转换可绘制对象

此 XML 文件用于定义可在两种可绘制对象资源之间交错淡出的可绘制对象。创建 TransitionDrawable。

插入可绘制对象

此 XML 文件用于定义以指定距离插入其他可绘制对象的可绘制对象。当视图需0要小于视图实际边界的背景可绘制对象时,此类可绘制对象很有用。

裁剪可绘制对象

此 XML 文件用于定义对其他可绘制对象进行裁剪(根据其当前级别值)的可绘制对象。创建 ClipDrawable。

缩放可绘制对象

此 XML 文件用于定义更改其他可绘制对象大小(根据其当前级别值)的可绘制对象。创建 ScaleDrawable

形状可绘制对象

此 XML 文件用于定义几何形状(包括颜色和渐变)。创建 ShapeDrawable。

另请参阅动画资源文档,了解如何创建 AnimationDrawable。

注:颜色资源也可用作 XML 中的可绘制对象。例如,在创建状态列表可绘制对象时,可以引用 android:drawable 属性的颜色资源 (android:drawable="@color/green")

shape

shape顾名思义就是形状的意思,在我们平时的开发中,应用的频率也很高,该文件是一个xml文件,并放在drawale文件夹下如res/drawable/filename.xml, 那么引用方式也很简单了,我们一般在控件的background使用,如android:background="@drawable/filename"。所有属性如下

xmlns:android="http://schemas.android.com/apk/res/android"

android:shape=["rectangle" | "oval" | "line" | "ring"] >

android:radius="integer"

android:topLeftRadius="integer"

android:topRightRadius="integer"

android:bottomLeftRadius="integer"

android:bottomRightRadius="integer" />

android:angle="integer"

android:centerX="float"

android:centerY="float"

android:centerColor="integer"

android:endColor="color"

android:gradientRadius="integer"

android:startColor="color"

android:type=["linear" | "radial" | "sweep"]

android:useLevel=["true" | "false"] />

android:left="integer"

android:top="integer"

android:right="integer"

android:bottom="integer" />

android:width="integer"

android:height="integer" />

android:width="integer"

android:color="color"

android:dashWidth="integer"

android:dashGap="integer" />

简单效果图

6daedc2b1178

这里写图片描述

xml实现文件:

android:shape="rectangle">

android:radius="15dp"

android:topLeftRadius="3dp" />

android:centerColor="#00ff00"

android:centerX="0.5"

android:centerY="0.5"

android:endColor="#0000ff"

android:gradientRadius="25dp"

android:startColor="#ff0000"

android:type="radial" />

android:width="10dp"

android:height="10dp" />

android:bottom="15dp"

android:left="15dp"

android:right="15dp"

android:top="15dp" />

在xml文件实现shape和用java代码实现大同小异,他们命名规则都是相对应的,可参照官方API文档,戳此链接查看。

图层列表layer-list

LayerDrawable 是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象按照列表的顺序绘制,列表中的最后一个可绘制对象绘于顶部。每个可绘制对象由单一 元素内的 元素表示。我们需要注意的是layer-list中有item的先后顺序会影响展示效果,不同顺序的效果可能大相径庭,因为,后面的item总是在之前的item之上并覆盖显示。

xmlns:android="http://schemas.android.com/apk/res/android" >

android:drawable="@[package:]drawable/drawable_resource"

android:id="@[+][package:]id/resource_name"

android:top="dimension"

android:right="dimension"

android:bottom="dimension"

android:left="dimension" />

默认情况下,所有可绘制项都会缩放以适应包含视图的大小。因此,将图像放在图层列表中的不同位置可能会增大视图的大小,并且有些图像会相应地缩放。为避免缩放列表中的项目,请在 元素内使用 元素指定可绘制对象,并且对某些不缩放的项目(例如 "center")定义重力。例如,以下 定义缩放以适应其容器视图的项目:

为避免缩放,以下示例使用重力居中的 元素:

android:gravity="center" />

layer-list的强大之处在于,它的每一个item都可以是一个shape.例如,开始我们的控件有一个需求将控件显示有一个1px边框的矩形,如下图

6daedc2b1178

这里写图片描述

那么我们一个可以通过一个shape就可以实现,如下

android:shape="rectangle">

android:width="1px"

android:color="#9b9b9b" />

android:bottom="5dp"

android:left="8dp"

android:right="8dp"

android:top="5dp" />

那么如果我们新的需求变更了,左右上边框不展示了,即只展示下面的一条线,那么怎么实现呢,可能大家最常用的就是用一个1px高度的view加个背景色填充,但是如果我们想显示左边和边的边框呢?那么需要再加View,布局可能会很复杂。可能你也会说,shape可以指定android:shape="line"来绘制一条线,那么咱来试试。

6daedc2b1178

这里写图片描述

这就是实现的效果图,发现,线是在中间,这肯定不是我们想要的效果,我们想要的效果是线在控件的最下方,其实此时shape已经不能满足我们的需求了,但是layer-list可以实现,想有哪个边框都可以。如下实现

android:bottom="5dp"

android:left="8dp"

android:right="8dp"

android:top="5dp" />

效果图:

6daedc2b1178

这里写图片描述

那么如果我们想在控件左边和下面显示边框线,那么在上述lsyer-list中第二个item加一句 android:left="1px"就可以实现了。如下图

6daedc2b1178

这里写图片描述

是不是比用view填充方便呢,关于java代码实现可以直接去参考官方文档,详情戳此链接。今天就介绍到这,有问题欢迎指出,Have a wonderful day.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐