📌  相关文章
📜  android在drawable中的多个形状 (1)

📅  最后修改于: 2023-12-03 15:13:22.789000             🧑  作者: Mango

Android 在 Drawable 中的多个形状

Android 中的 Drawable 是一个可绘制的对象,可以用于绘制矩形、圆形、渐变、图片等等。Drawable 可以保存在 \res\drawable 目录下,并被用于视图的背景、前景、图标、图片等各种情况。

在 Drawable 中实现形状有很多方式,以下介绍了其中的几种方式。

Shape Drawable

Shape Drawable 是 Android 中最基本的 Drawable 类型之一,用于绘制矩形、圆形、三角形等形状。Shape Drawable 可以通过 XML 文件或者代码绘制。

通过 XML 文件绘制 Shape Drawable

在 \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 的形状,可以是 rectangleovalline 或者 ring

<solid> 节点定义填充颜色,<stroke> 节点定义边框线条,<corners> 节点定义圆角。

通过代码绘制 Shape Drawable

可以通过编程的方式创建 Shape Drawable,步骤如下:

  1. 创建一个 ShapeDrawable 类型的对象
ShapeDrawable shape = new ShapeDrawable();
  1. 调用 setShape() 方法设置形状
shape.setShape(new RectShape()); // 矩形
shape.setShape(new OvalShape()); // 圆形
shape.setShape(new RoundRectShape(radiusArray, null, null)); // 圆角矩形
  1. 调用 setBounds() 方法设置大小位置
shape.setBounds(left, top, right, bottom);
  1. 调用 setPaint() 方法设置样式
Paint paint = new Paint();
paint.setColor(Color.RED);
shape.setPaint(paint);
Layer Drawable

Layer Drawable 是对多个 Drawable 进行合成的一种 Drawable 类型,将多个 Drawable 组合在一起,而不是像 Shape Drawable 那样只能绘制一个形状。

通过 XML 文件生成 Layer 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。

下面是一个生成 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

State List Drawable 是对某个 Drawable 在不同状态下进行切换的一种 Drawable 类型,常用于按钮的点击效果、ListView 的 Item 状态、Tab 选中状态等。

通过 XML 文件生成 State List Drawable

下面是一个生成 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。

下面是一个生成 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

Level List Drawable 是对某个 Drawable 根据级别进行切换的一种 Drawable 类型,常用于表情等可以切换不同级别的图标。

通过 XML 文件生成 Level List 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。

下面是一个生成 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 应用提供了很大的灵活性。