在自定义控件起步(一)(简单的自定义view)中我们画了一个简单地矩形,但这个矩形的颜色是在代码中写死了,
那么我们怎么在布局文件中设置这个矩形的大小呢?这就需要用到自定义属性:
首先.先说说自定义属性的几种类型:
1.string 字符串类型,如设置TextView的文字内容为"99999"
2.color 颜色值类型,如设置TextView的文字颜色为#00FF00
3.demension 尺寸,大小,如设置TextView的文字大小为13sp 13dp 13px等
4.integer 整形,,如设置动画的持续时间为100毫秒
5.enum 枚举类型,,如设置TextView的宽度为为wrap_content match_parent
6.reference 引用类型,,如设置TextView的背景为@drawable/ic_launcher
7.float 浮点类型,,如设置动画从1到0.5
8,如设置TextView的背景为@drawable/ic_launcher8.boolean 布尔类型,如设置TextView的是否可获取焦点为true false
9.fraction 百分比,如设置动画动画的中轴点20%
10.flag 位或运算,比如设置软键盘"stateUnspecified | stateUnchanged | stateHidden"
接下来,我会接着上一篇,使用自定义属性来设置大小
步骤:
1.声明自定义属性 我们需要一个颜色,一个宽度,一个高度
<declare-styleable name="myView">
<attr name="rectColor" format="color" />
<attr name="rectWidth" format="dimension" />
<attr name="rectHeight" format="dimension" />
</declare-styleable>
注意: 这里的name是做什么? 这个name用来作为自定义属性集的一个标记,等会我们在构造方法中获取自定义属性会用的到
2.使用自定义属性
使用之前,我们需要现在早跟布局中添加一个命名空间'
xmlns:defind="http://schemas.android.com/apk/res/com.example.defindedview"
还是看一下图吧
注意:com.example.defindedview是包名,那么问题来了,为什么要在这里添加一个命名空间呢?因为自定义属性是我们后来写的,
系统通过命名空间才能找到我们创建的自定义属性. 这就跟为什么我们在布局文件中使用自定义view时为什么要使用类的全名,
是一个原因,你如果就写一个MyView,安卓系统就找不到这个类,就会报一个类找不到的异常
<com.example.defindedview.MyView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
defind:rectColor="#999"
defind:rectHeight="100dp"
defind:rectWidth="250dp" />
3.在构造方法中获取这些属性值
TypedArray这个类里边放了我们属性值
// 获取矩形颜色,宽度和高度
TypedArray typedArray = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.myView, defStyle, 0);//第三个参数 刚刚提到过 作为自定义属性集合的名称
int rectColor = typedArray.getColor(R.styleable.myView_rectColor,//<span class="link_title"></span>myView_rectColor 前边是属性集合的名称,后边是属性名称
Color.GRAY);
int rectWidth = typedArray.getDimensionPixelSize(
R.styleable.myView_rectWidth, dip2px(context, 30));
int rectHeight = typedArray.getDimensionPixelSize(
R.styleable.myView_rectHeight, dip2px(context, 20));
typedArray.recycle();//一定要记得回收
Log.e("TAG", "rectColor=" + rectColor + ",rectWidth=" + rectWidth
+ ",rectHeight=" + rectHeight);
上边我们将获取到的属性值通过Log打印出来,下面我们运行一下,看下Log日志:
4.使用自定义属性值 将刚才获取的颜色值设置给画笔 将宽和高设置给矩形
mPaint.setColor(rectColor);// 设置画笔颜色
mRect = new Rect(0, 0, rectWidth, rectHeight);
运行一下,效果如下:
到这你基本上已经掌握自定义属性的使用步骤了,点击这里下载源码