自定义视图中自定义属性的使用
这篇文章主要解决以下问题,
尼古拉丁 说过吃别人嚼过的馍不香 ,如果能再嚼一遍那很好 嚼过之后能咽进自己的肚子里 那更好
1 自定义视图在xml文件中使用属性
2 怎么自定义一个view
3自定义视图中坐标的问题
所有都亲测可用,如果有疑义欢迎一起讨论
目的
1 绘制 一个圆环 圆环上有一个小球在转动
2 可添加自定义属性 圆环的半径 小球的半径 小球的转动速度
设置自定义属性 并获取
关于自定义属性我们分以下几个步骤 来分析
1在哪里定义 怎么定义
2 在xml文件中怎么使用
3 在自定义view 中怎么获取xml文件中自定义的值
在哪里定义 怎么定义
自定义属性在res->values->attrs 文件中建立,我的自定义属性名字起为CircleView, declare <声明> 这个名字理论上可以随便起,但是为了我们使用和更改方便 我们把它的名字起为我们自定的视图的名字 attr name 就是我们使用的属性名 formate就是我们属性的单位 这里包括 floater integer 等
<resources>
<declare-styleable name="CircleView">
<attr name="ringRadius" format="float"/>
<attr name="globuleRadius" format="float"/>
<attr name="globuleSpeed" format="integer"/>
</declare-styleable>
</resources>
在 XML 文件中怎么使用
先说以前 旧的方法是 因为自定义属性属于APP命名空间,也就是http://schemas.android.com/apk/res/[your package name] 而不是内建属性的命名空间 http://schemas.android.com/apk/res/android ,所以你需要在 XML 文件中指出 自定义视图属性 所属于的命名空间 也就是在apk/res/your packge name
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.newstart.zhangjianlong.demoview"
android:layout_width="match_parent"
android:layout_height="match_parent">
这样你才能在自定义视图中 使用自定义属性。
但是 请注意这是但是 但是现在不需要了 你只需要指定auto就行了 看代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.newstart.zhangjianlong.demoview.view.CircleView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:ringRadius="8"
app:globuleRadius="2"
app:globuleSpeed="3"
/>
</LinearLayout>
其中 xmlns:app=”http://schemas.android.com/apk/res-auto” 就会自动帮我们指定命名空间 “app =” 这个系统自动起名为 app 你自己随便起名也可以 换成 custom 也不影响使用,之所以用了个 app = 就是为了不在你使用的时候写那么长的http://schemas.android.com/apk/res-auto,好处你可以自己想。 好了以上就是如何在 xml中使用自定义属性
在自定义视图中获得XML文件中给定的属性值
好了 当你的视图在XML 文件中创建好后 所有的属性都从资源包中读取出来,然后作为一个attributeSet传递给view 这也就是我们的构造函数中 我建议123 都写上。那么开始思考 你传了 可是我怎么读取出来呢 你可能想那还不简单啊 attributeSet 中肯定有get方法啊 直接get出来不就这么简单吗。 恩 你这么想证明你和我想的一样。但是Android的官方教程中说 这个attributeset 没有进行处理 还有样式没有得到容许 什么意思呢 我没看这个的源码 所以也不太清楚,但是根据Google的尿性 应该是这个是个公共资源不应该私有 也就是你不应该直接把持用公共资源。
重点 那怎么用
看代码
private void getAttributeSet(Context context, AttributeSet attrs) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs//传进来的attrs
, R.styleable.CircleView//你自己定义的attrs
, 0//设置的默认属性 这些我们都没有设置所以直接写0
, 0//设置的默认style(样式)这些我们都没有设置所以直接写0
);
try {
mGlobuleRadiu = typedArray.getFloat(R.styleable.CircleView_globuleRadius, 10f);
speed = typedArray.getInt(R.styleable.CircleView_globuleSpeed, 3);
mRingRadiu = typedArray.getFloat(R.styleable.CircleView_ringRadius, 100f);
}finally {
typedArray.recycle();
}
}
需要注意的几点
1 typeArray使用过后要回收 因为他关联着公共资源
2 例如 typeArray.getFloat 中第一个参数 是你自定义属性的名字 第二个参数是如果没有从XML文件中获得这个属性的值 你需要设定一个默认值
以上就完成了 自定义属性的 设定和使用,在下一篇文章中我们将实质性的进入到 自定义视图阶段。