📅  最后修改于: 2023-12-03 15:13:22.789000             🧑  作者: Mango
Android 中的 Drawable 是一个可绘制的对象,可以用于绘制矩形、圆形、渐变、图片等等。Drawable 可以保存在 \res\drawable 目录下,并被用于视图的背景、前景、图标、图片等各种情况。
在 Drawable 中实现形状有很多方式,以下介绍了其中的几种方式。
Shape Drawable 是 Android 中最基本的 Drawable 类型之一,用于绘制矩形、圆形、三角形等形状。Shape Drawable 可以通过 XML 文件或者代码绘制。
在 \res\drawable 目录下创建 XML 文件,并在其中定义 Shape Drawable。
下面是一个绘制矩形的示例:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ffffff" />
<stroke
android:width="1dp"
android:color="#000000" />
<corners android:radius="5dp" />
</shape>
其中,android:shape
属性指定 Shape Drawable 的形状,可以是 rectangle
、oval
、line
或者 ring
。
<solid>
节点定义填充颜色,<stroke>
节点定义边框线条,<corners>
节点定义圆角。
可以通过编程的方式创建 Shape Drawable,步骤如下:
ShapeDrawable shape = new ShapeDrawable();
setShape()
方法设置形状shape.setShape(new RectShape()); // 矩形
shape.setShape(new OvalShape()); // 圆形
shape.setShape(new RoundRectShape(radiusArray, null, null)); // 圆角矩形
setBounds()
方法设置大小位置shape.setBounds(left, top, right, bottom);
setPaint()
方法设置样式Paint paint = new Paint();
paint.setColor(Color.RED);
shape.setPaint(paint);
Layer Drawable 是对多个 Drawable 进行合成的一种 Drawable 类型,将多个 Drawable 组合在一起,而不是像 Shape Drawable 那样只能绘制一个形状。
下面是一个生成 Layer Drawable 的示例:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_rectangle" />
<item android:drawable="@drawable/shape_oval" />
</layer-list>
其中,<item>
节点用于指定每一层的 Drawable。
可以通过编程的方式创建 Layer Drawable。
下面是一个生成 Layer Drawable 的示例:
// 创建一个 LayerDrawable 对象
Drawable[] layers = new Drawable[2];
layers[0] = getResources().getDrawable(R.drawable.shape_rectangle);
layers[1] = getResources().getDrawable(R.drawable.shape_oval);
LayerDrawable layerDrawable = new LayerDrawable(layers);
// 设置图层之间的间距
int padding = getResources().getDimensionPixelSize(R.dimen.padding);
layerDrawable.setLayerInset(1, padding, padding, padding, padding);
State List Drawable 是对某个 Drawable 在不同状态下进行切换的一种 Drawable 类型,常用于按钮的点击效果、ListView 的 Item 状态、Tab 选中状态等。
下面是一个生成 State List Drawable 的示例:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="true"
android:drawable="@drawable/selected_bg" />
<item
android:state_pressed="true"
android:drawable="@drawable/pressed_bg" />
<item android:drawable="@drawable/normal_bg" />
</selector>
其中,<item>
节点是子元素,用于指定每一种状态对应的 Drawable。
例如,android:state_selected="true"
表示被选中状态,android:state_pressed="true"
表示按下状态。
可以通过编程的方式创建 State List Drawable。
下面是一个生成 State List Drawable 的示例:
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, getResources().getDrawable(R.drawable.btn_pressed));
stateListDrawable.addState(new int[]{android.R.attr.state_enabled}, getResources().getDrawable(R.drawable.btn_normal));
Level List Drawable 是对某个 Drawable 根据级别进行切换的一种 Drawable 类型,常用于表情等可以切换不同级别的图标。
下面是一个生成 Level List Drawable 的示例:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="10" android:drawable="@drawable/emoji_1" />
<item android:maxLevel="20" android:drawable="@drawable/emoji_2" />
<item android:maxLevel="30" android:drawable="@drawable/emoji_3" />
<item android:maxLevel="40" android:drawable="@drawable/emoji_4" />
</level-list>
其中,<item>
节点用于指定每个级别对应的 Drawable。
可以通过编程的方式创建 Level List Drawable。
下面是一个生成 Level List Drawable 的示例:
LevelListDrawable levelListDrawable = new LevelListDrawable();
levelListDrawable.addLevel(0, 10, getResources().getDrawable(R.drawable.emoji_1));
levelListDrawable.addLevel(11, 20, getResources().getDrawable(R.drawable.emoji_2));
levelListDrawable.addLevel(21, 30, getResources().getDrawable(R.drawable.emoji_3));
levelListDrawable.addLevel(31, 40, getResources().getDrawable(R.drawable.emoji_4));
以上就是 Android 在 Drawable 中的多个形状的介绍。通过 Shape Drawable、Layer Drawable、State List Drawable、Level List Drawable 可以实现各种不同的效果,为开发 Android 应用提供了很大的灵活性。