您的位置:首页 > 移动开发 > Android开发

自定义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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 自定义View