为什么要有自定义属性,因为android中自带的属性不能满足我们的需求了,所以需要自定义属性。

  第一步:在res/values文件夹下添加一个attrs.xml文件,如果项目比较大,会导致attrs.xml代码比较多,可以根据相应的功能模块起名字,方便查找,如:登录相关的模块 attrs_login.xml

<?xml version="1.0" encoding="utf-8"?>
  <resources>
    <!--声明属性-->
  </resources>
  创建完成是这个样子

  第二步:文件创建完成怎么声明属性

  使用<declare-styleable name="CustomCilcles"></declare-styleable> 来定义一个属性集合,name对应的就是属性集合的名字,这个名字最好是见名之意。

 

<?xml version="1.0" encoding="utf-8"?>
  <resources>
    <declare-styleable name="CustomCircles">
   <!--添加属性-->
    </declare-styleable>
  </resources>

  第三步:定义属性,通过<attr name="textColor" format="color"/>方式来定义属性值,属性名字最好也是见名之意,format表示这个属性的值的类型。有如下几种属性:

 

  • reference:引用资源
  • string:字符串
  • Color:颜色
  • boolean:布尔值
  • dimension:尺寸值
  • float:浮点型
  • integer:整型
  • fraction:百分数
  • enum:枚举类型
  • flag:位或运算

    例如我们随笔定义几个属性:圆的半径,圆的背景颜色,进度的背景颜色,进度大小
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="CustomCircles">
 <attr name="circle_radius" format="integer"/>
 <attr name="circle_progress" format="integer"/>
 <attr name="circle_backgroundcolor" format="color"/>
 <attr name="circle_progresscolor" format="color"/>
 </declare-styleable>
</resources>

第四步: 怎么去使用这些属性了,  先到xml布局文件中去

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:qiaoning="http://schemas.android.com/apk/res-auto"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <com.kallaite.rxjavademo.customcontrols.CustomCircles
 android:layout_width="150dp"
 android:layout_height="150dp"
 qiao:circle_progress="360"
 qiao:circle_radius="50"
 qiao:circle_backgroundcolor="@android:color/holo_orange_dark"
 qiao:circle_progresscolor="@android:color/holo_red_dark"
 />
</LinearLayout>

为属性集设置一个属性集名称,我这里用的qiao,这个可以随便起,建议在真正的项目中使用项目的缩写,比如微信可能就是使用wx。

  第五步: 自定义空间中,如何获取自定义属性

  每一个集合编译之后都会对应一个styleable对象,通过styleable对象获取TypedArray,然后通过键值对获取到属性值

private void init(Context context, AttributeSet attrs) {

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomCircles);    //R.styleable.CustomCircles  这对应的是attrs.xml文件中定义的属性名字
backgroundColor = typedArray.getColor(R.styleable.CustomCircles_circle_backgroundcolor, Color.RED);
progressColor = typedArray.getColor(R.styleable.CustomCircles_circle_progresscolor, Color.BLACK);
circleProgress = typedArray.getInteger(R.styleable.CustomCircles_circle_progress, 20);
int circleRadius = typedArray.getInteger(R.styleable.CustomCircles_circle_radius, 40);

}

attrs是怎么来的呢? 还记得构造方法吗?  从第一个属性开始就有attrs这个参数,需要传递过来使用, 一个参数的构造方法传null就可以了

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

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

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

通过上述步骤就可以拿到我们在xml布局文件中定义的属性值,在init()方法中取得就可以拿去使用了。