自定义View(一):自定义属性获取
2017-10-12 10:14
120 查看
1、什么是自定义属性
在Android的开发过程中,我们在写xml布局的时候会用到许多组件的属性来控制组件的外观和特点,那其中到底是怎么实现的呢,今天我们来探究一下如何编写自定义属性。2、新建一个类MyView继承View
我们可以看到View有四个构造方法第一个构造方法是最简单的构造方法,在Java代码中新建一个View对象且只有context一个参数的时候会调用。
第二个构造方法在自定义属性中至关重要,当一个组件在xml中引用的时候就会调用调用该方法。
第三个构造方法和第四个构造方法在定义主题的时候回调用,在View指定了一个主题的情况下,View的某些属性尽管我们不去赋值它也会有值,这时就依靠这两个构造方法去实现,在不同的情况下,这两个构造方法会有不同的优先级去调用。
3、在values下新建一个attr.xml,其内容如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView"> <!--name:自定义属性名,format:自定义属性数据类型--> <attr name="mtext" format="string"></attr> <attr name="mcolor" format="color"></attr> <attr name="msize" format="dimension"></attr> <attr name="mfloat" format="float"></attr> </declare-styleable> </resources>
format有10种数据类型,如下:
string,顾名思义,字符串类型
dimension,尺寸类型
boolean,布尔类型
color,颜色类型
enum,枚举类型
flag,位或运算
fraction,百分数
integer,整型
reference,参考某一资源ID
4、在xml中引用MyView
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.attrdemo.MainActivity"> <com.attrdemo.MyView android:layout_height="200dp" android:layout_width="250dp" android:layout_gravity="center" android:background="@android:color/darker_gray" app:mcolor="@color/colorPrimary" app:msize="16px" app:mtext="你地好吗" app:mfloat="6.66"/> </FrameLayout>
可以看到我们刚刚在attr.xml中定义的新属性都在MyView中得以调用,值得关注的是
xmlns:app="http://schemas.android.com/apk/res-auto"
这句的作用是app:以自动查找的方式引入一个命名空间。
5、在Java中获取这些定义了的属性
话不多说,贴代码private String mtext; private int mcolor; private int msize; private float mfloat; public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyView); mtext = array.getString(R.styleable.MyView_mtext); mcolor = array.getColor(R.styleable.MyView_mcolor, Color.BLACK); msize = array.getDimensionPixelSize(R.styleable.MyView_msize, 100); mfloat=array.getFloat(R.styleable.MyView_mfloat, (float) 1.234); array.recycle(); //释放资源 Log.i("debug","text:"+mtext); Log.i("debug","color:"+mcolor); Log.i("debug","size:"+msize); Log.i("debug","float:"+mfloat); }
可以看到通过context类的obainStyledAttributes()方法获取TypedArray对象,再通过TypedArray对象的get方法获取属性的值,在往后的onMeasure()和onDraw()中会有用到。
程序运行结果如下:
6、源码链接
https://github.com/Hasagit/AttrDemo.git
相关文章推荐
- 盘点自定义view里面容易混淆的获取控件属性的方法
- 自定义View-获取自定义属性
- Android自定义View获取自定义属性
- Android基础教程——在TextView中显示Html 自定义标签,获取标签属性
- android自定义控件(7)-获取自定义ImageView的src属性
- Android之探究viewGroup自定义子属性参数的获取流程
- android自定义View构造方法以及获取自定义属性详解
- 多个checkbox全选和获取已选择的checkbox的demo以及自定义属性的使用
- Android 自定义View并添加属性
- 自定义View属性
- Android 自定义View 中attr属性 深入解析
- 安卓自定义View进阶-自定义XML属性解析及R.attr和R.styleable的区别
- Android 自定义view和属性动画实现充电进度条效果
- android 自定义view+属性动画实现充电进度条
- android中自定义View设置属性
- onWindowFocusChanged (boolean hasWindowFocus) 一个很重要的回调函数,执行后才能获取到view的width等属性
- Dialog的自定义view无法获取到点击事件
- 这可能是第二好的自定义 View 教程之属性动画
- Android自定义view之属性动画初见
- 抽奖转盘(二)属性动画的简单实现和自定义View实现