Android 自定义View(一)

自定义视图中自定义属性的使用

这篇文章主要解决以下问题,

尼古拉丁 说过吃别人嚼过的馍不香 ,如果能再嚼一遍那很好 嚼过之后能咽进自己的肚子里 那更好


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文件中获得这个属性的值 你需要设定一个默认值

以上就完成了 自定义属性的 设定和使用,在下一篇文章中我们将实质性的进入到 自定义视图阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值