如何使用 declare-styleable

declare-styleable 是 Android 提供的一个重要的 XML 标签,用于自定义 View 的属性。通过此标签,我们可以为自定义 View 定义一系列的属性,并通过 XML 文件来设置它们的值。下面详细介绍 declare-styleable 的具体使用方法以及相关的注意点和实际应用案例。

## 基本用法

首先,在 res/values 目录下新建一个名为 attrs.xml 的 XML 文件,并添加以下内容来定义属性:

```xml

Java 类中使用这些属性:

```java

public class MyCustomView extends View {

private boolean mEnabled;

private int mTextColor;

private float mTextSize;

public MyCustomView(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);

mEnabled = a.getBoolean(R.styleable.MyCustomView_enabled, true);

mTextColor = a.getColor(R.styleable.MyCustomView_textColor, Color.BLACK);

mTextSize = a.getDimension(R.styleable.MyCustomView_textSize, 16f);

a.recycle();

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (mEnabled) {

Paint paint = new Paint();

paint.setColor(mTextColor);

paint.setTextSize(mTextSize);

canvas.drawText("Hello, World!", 100, 100, paint);

}

}

}

```

在 MyCustomView 类的实现中,我们使用 TypedArray 类分别获取了 attrs.xml 中定义的三个属性的值,并进行了处理。其中,getBoolean()、getColor()、getDimension() 方法分别用于从 TypedArray 中获取布尔、颜色和尺寸值。最后一句 a.recycle() 在使用完 TypedArray 后进行了回收。

使用自定义 View 的布局文件则如下:

```xml

android:layout_width="wrap_content"

android:layout_height="wrap_content"

app:enabled="false"

app:textColor="@color/textColorPrimary"

app:textSize="18sp" />

```

在布局文件中调用 MyCustomView 并设置相应的属性即可。注意到其中的 app 命名空间,声明时要与 res/values/attrs.xml 中定义的 name 属性值保持一致。

## 注意事项

使用 declare-styleable 时需注意以下几点:

1. 根据系统版本不同,可以使用不同的格式类型。比如在 API level 21 中,还加入了以下新增的格式类型:fraction、layout_dimension、layout_gravity、string、drawable、integer。

2. 在 AttributeSet 参数中,由于每进行一次实例化都会消耗比较大的资源,因此应尽量避免创建新的 TypedArray 对象。可以使用 Context.obtainStyledAttributes(resId, attrs) 方法进行复用。

3. 使用完 TypedArray 后需记得调用 recycle() 方法,进行清理资源。

## 实际应用案例

以 CustomView 为例,实现一个具有自定义属性的 TextView,分别为文字大小、字体颜色和是否加粗:

```xml

```

```java

public class CustomView extends AppCompatTextView {

private float textSize = 14f;

private int textColor = Color.BLACK;

private boolean textBold = false;

public CustomView(Context context, AttributeSet attrs) {

super(context, attrs);

init(attrs);

}

private void init(AttributeSet attrs) {

TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.CustomView);

textSize = typedArray.getDimension(R.styleable.CustomView_textSize, 14f);

textColor = typedArray.getColor(R.styleable.CustomView_textColor, Color.BLACK);

textBold = typedArray.getBoolean(R.styleable.CustomView_textBold, false);

typedArray.recycle();

setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);

setTextColor(textColor);

setTypeface(Typeface.DEFAULT);

if (textBold) setTypeface(Typeface.DEFAULT_BOLD);

}

}

```

以 RelativeLayout 为例,实现一个具有 shape 样式的 ImageView,包括背景颜色和圆角度数:

```xml

```

```java

public class RoundImageView extends AppCompatImageView {

private int backgroundColor;

private float cornerRadius;

public RoundImageView(Context context, AttributeSet attrs) {

super(context, attrs);

init(attrs);

}

private void init(AttributeSet attrs) {

TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.RoundImageView);

backgroundColor = typedArray.getColor(R.styleable.RoundImageView_backgroundColor, ContextCompat.getColor(getContext(), android.R.color.transparent));

cornerRadius = typedArray.getDimension(R.styleable.RoundImageView_cornerRadius, 0f);

typedArray.recycle();

GradientDrawable gradientDrawable = new GradientDrawable();

gradientDrawable.setColor(backgroundColor);

gradientDrawable.setCornerRadius(cornerRadius);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

setBackground(gradientDrawable);

} else {

setBackgroundDrawable(gradientDrawable);

}

}

}

```

以上两个案例只是 declare-styleable 的一部分使用场景,我们可以根据自己的需求来使用该标签进行更多实际开发中的应用。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(106) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部