一起Talk Android吧(第四百六十三回:自定义属性)


各位看官们大家好,上一回中咱们说的例子是"对drawable中获取到的Bitmap进行缩放",这一回中咱们说的例子是" 自定义属性"。闲话休提,言归正转,让我们一起Talk Android吧!

使用背景

我们在前面章回中介绍了从Drawable中获取Bitmap的方法,其中使用了自定义属性的内容,本章回中将介绍如何自定义属性。自定义属性也是自定义控件的基础知识,,在此之后,我们将介绍自定义控件的知识,希望大家能够掌握此知识,为我们在后面章回中学习自定义控件打好基础。

实现方法

我们将通过文字结合代码的方式来介绍如何自定义属性:

  1. 创建属性资源文件
    在values目录上右键new->File->ValuesResourceFile,弹出窗口中填写attrs后会自动创建一个名叫attrs.xml的属性资源文件,该文件位于values目录下,如果项目中已经存在该文件,那么可以跳过本步骤直接进入下一个步骤;
  2. 创建属性集合
    在上一步创建的资源文件中创建属性集合,此集合中可以包含多个属性,代码中通过name来定义此属性集合的名称,比如name="CustomViewA",这个名称是自己定义的,属性名称最好和自定义的控件名称保持一致,这样便于管理。
  3. 创建属性
    在属性集合中创建属性,这个属性就是控件中使用的属性,比如控件中的常用的id,width等属性。详细请参考以下代码:
<declare-styleable name="CustomViewA"> 
    <attr name="color" format="reference"/>
</declare-styleable> 

代码中最外层的标签是上一步骤中创建属性集合,att标签包含的内容就是属性,属性集合中只有一条属性,我们可以在属性集合中创建多个属性。attr标签中的name用来定义属性名称,类似我们在其它控件中经常使用的id,width,length等。format表示属性的类型,类似程序中变量的类型。可以使用的类型有多种,详细说明如下:

  • reference表示引用drawable,string,color中的资源,比如@string/xxx就是使用字符串中的资源
  • color表示可以颜色类型,可以直接使用十六进制的RGB颜色,或者其它颜色资源
  • dimension表示尺寸值,可以直接使用尺寸值或者其它尺寸资源
  • flag表示程序中的枚举,比如常用的gravity属性值有center,tom,bottom等
  • boolean表示布尔值,它的值只有true和false两种,与此类型相似的还是其它数值类型,比如float,integer,string,enum,fraction(百分比)。

这些类型可以使用|符号组合使用,表示属性具备多种类型比如 fromat="integer|float"表示属性值可以是整数或者浮点数。

  1. 响应属性
    响应属性就是依据不同的属性来做不同的事情,响应属性的操作在代码中,具体位置在自定义控件的构造方法中,详细的代码和使用方法如下:
    //获取属性集合
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomStyle);
    //获取属性集合中的color属性值,如果没有指定color属性,那么使用默认值RED
    int color = typedArray.getColor(R.styleable.CustomViewA_color,Color.RED);
    //响应color属性,把画笔的颜色设定为属性中指定的颜色
    mPaint.setColor(color);
    //释放资源
    typedArray.recycle();

在上面的代码中,context和attrs是构造方法中传入的参数,可以直接使用。CustomStyle就是属性集合的名称,可以替换为步骤3中的CustomViewA,我们把属性集中的内容都存放在TypedArray类型的变量中,该类型提供了各种getXXX方法来获取属性集合中的属性值,具体使用哪个属性呢?通过getXXX方法的第一个参数 指定,注意该参数名称通过属性集名称+下划线+属性名的方式命名,方法的第二个参数是属性默认值,如果控件中使用了属性,那么就获取属性当前的值,否则使用该参数指定的默认值。上面的代码中我们对color这个属性做出了响应:把color的属性值设定当前画笔的颜色。在响应完属性后一定记得释放资源,不然会引起内存泄漏。

此外,在使用getXXX方法时需要和属性的类型匹配,比如属性在format中指定为float,那么就需要使用getFloat方法。这些方法中有一个常用的方法用来获取属性的长度值:getDimensionPixelSize(),与它对应的属性类型为需要设置为format="dimension",我们在属性中使用的20dp等值就对应这个类型。

使用方法

属性定义好后就可以使用了,通常会用在自定义的控件中。其实自定义属性的使用方法和普通控件的使用方法类似。不过它还有一些特殊的知识需要介绍,接下来我们将介绍如何在控件中使用自定义的属性。

首先需要在布局文件中引入自定义的属性,引入方法就是在布局类型(比如LinearLayout)的标签中使用xmlns引入,示例代码如下:

 <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto">

代码中的app就是自己命名的属性前缀,可以理解为java中的包名。在控件中通过属性前缀+属性名称来使用属性,比如app:color就是在使用名叫color的自定义属性。

注意使用属性时需要加上前缀app.不然无法识别属性。对比一下使用系统控件中属性的方法:android:layout_height=""。它使用的前缀是android,这表示系统属性,属性名称是layout_heigth。经过对比分析后,大家是不是觉得自定义属性的使用方法和系统属性的使用方法十分类似?

看官们,在本章回中我们主要介绍了自定义属性的内容,希望大家能够自己动手来实践,这样可以加深理解 ,此外通过自定义属性也可以明白系统控件中属性的实现原理,比如我们常用的id属性:android:id="@+id/xxx",属性的前缀android就是通过xmlns引入的,使用id属性时也是通过"前缀+属性名"这种方式来使用。这是一种知识的演绎:通过一种知识掌握与此知识相似的知识。

看官们,关于"自定义属性"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值