Android 自定义 View 简单指南(04自定义属性)

·  阅读 1158

自定义属性

怎么使用系统已经定死没有什么好挣扎的,按照步骤一步一步来即可。

  1. res/values文件夹下创建 attr.xml 文件。

  2. attr.xml 文件中创建 declare-styleable节点,并定义 name 属性。

    name 属性为自定义view类名。

  3. 然后就可以在 declare-styleable节点中定义 attr节点定义属性了,attr 节点有两个属性

    • name : 在布局中使用该属性的名字。
    • format : 属性的类型,一共有 10 种。
      • boolean : 布尔类型
      • color:颜色类型,可以是16进制表示也可以是@color表示
      • dimension:表示 attr 取值是尺寸类型,例如16sp,16dp,也可以是一个@dimen类型
      • float: 表示 attr 取值类型是整型或浮点型
      • integer:表示attr取值类型是整型
      • fraction:表是attr取值是百分之数类型,只能以%结尾。
      • string:表示 string 类型,或者指向 String 资源的 id。
      • refrerence 表示 attr 取值只能是指向一个资源的id。
      • enum 表示 attr 取值只能是枚举类型。
      • flag 表示 attr 取值是 flag 类型.
  4. 最后在自定义 view 的构造方法中获取自定义属性并进行解析。

使用

我们为上节定义的 View 添加一个颜色属性,改变绘制的圆圈的颜色。

step 1

新建 attr.xml 文档,并定义属性。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="FreeStyleView">
        <attr name="color" format="color"></attr>
    </declare-styleable>
</resources>
复制代码

step 2

在自定义 View 中处理自定义属性。

这里将之前写的init() 方法稍作改造。

 public FreeStyleView(Context context) {
        super(context);
        init(context,null);
    }

    public FreeStyleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public FreeStyleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void init(Context context, AttributeSet attrs) {
        // 用代码新建的没有xml定义的属性
        if (attrs != null){
            // 处理属性(Android系统自带的属性我们不用定义即可使用,but还是要处理的)
            // 这一步是解析属性,因为不这样操作通过循环我们也能拿到属性名字以及对应的值,但适配、以及获取资源不太易操作。
            TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.FreeStyleView);
            // 获取颜色,第一个参数是在 attr 定义的属性,系统做了处理,名称变成了FreeStyleView_color,
            // 第二个参数是默认值
            color = typedArray.getColor(R.styleable.FreeStyleView_color,color);
        }

        paint = new Paint();
        // 设置画笔模式,FILL 填充,STROKE 描边
        paint.setStyle(Paint.Style.STROKE);
        // 设置画笔颜色
        paint.setColor(color);
        // 设置画笔宽度,px 为单位,实际需要转换成 dp 值
        paint.setStrokeWidth(8);
    }
复制代码

step 3

最后在布局文件中使用自定义的属性

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.myapplication.view.FreeStyleView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:color="#eeff16"/>

</RelativeLayout>
复制代码

效果

VuJzsH.md.png

扩展

思考:Android 实现自定义属性的机制?

洋神的文章引路

示例代码:github.com/bukeCN/Free…

分类:
Android
标签:
分类:
Android
标签: