有时候android传统的页面布局不足以满足我们的需求,常常需要自己定义view,通常继承View,然后重写构造方法以及onDraw等函数,再具体实现自己定义的复杂view。我们知道在给控件赋属性时,通常使用的是android系统自带的属性,比如 android:layout_height="wrap_content",除此之外,我们亦可以自己定义属性,这样在使用的时候我们就可以使用形如 myapp:myTextSize="20sp"的方式了,步骤大致如下:
1》在项目文件res/value下面创建一个attr.xml文件,该文件中包含若干个attr集合,例如:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <declare-styleable name="MyView">
- <attr name="myTextSize" format="dimension"/>
- <attr name="myColor" format="color"/>
- </declare-styleable>
- </resources>
其中resource是跟标签,可以在里面定义若干个declare-styleable,<declare-styleable name="MyView">中name定义了变量的名称,下面可以再自定义多个属性,针对<attr name="myTextSize" format="dimension"/>来说,其属性的名称为"myTextSize",format指定了该属性类型为dimension,只能表示字体的大小。
format还可以指定其他的类型比如;
reference 表示引用,参考某一资源ID
string 表示字符串
color 表示颜色值
dimension 表示尺寸值
boolean 表示布尔值
integer 表示整型值
float 表示浮点值
fraction 表示百分数
enum 表示枚举值
flag 表示位运算
string 表示字符串
color 表示颜色值
dimension 表示尺寸值
boolean 表示布尔值
integer 表示整型值
float 表示浮点值
fraction 表示百分数
enum 表示枚举值
flag 表示位运算
2》在使用到该自定义view的布局文件中键入如下的一行:
xmlns:myapp=http://schemas.android.com/apk/res/com.eyu.attrtextdemo绿色是自己定义属性的前缀名字,粉色是项目的包名,这样一来,在我们自己定义的view的属性中,就可以使用自己在attr中定义的属性啦,例如:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:myapp="http://schemas.android.com/apk/res/com.eyu.attrtextdemo"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/hello_world" />
- <com.eyu.attrtextdemo.MyView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- myapp:myTextSize="20sp"
- myapp:myColor="#324243"/>
- </LinearLayout>
3》在自定义view的代码中引入自定义属性,修改构造函数
context通过调用obtainStyledAttributes方法来获取一个TypeArray,然后由该TypeArray来对属性进行设置
obtainStyledAttributes方法有三个,我们最常用的是有一个参数的obtainStyledAttributes(int[] attrs),其参数直接styleable中获得
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
调用结束后务必调用recycle()方法,否则这次的设定会对下次的使用造成影响
具体如下:
- package com.eyu.attrtextdemo;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.graphics.Paint.Style;
- import android.util.AttributeSet;
- import android.view.View;
- public class MyView extends View{
- public Paint paint;
- public MyView(Context context, AttributeSet attrs) {
- super(context, attrs);
- paint = new Paint();
- TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
- int textColor = a.getColor(R.styleable.MyView_myColor, 003344);
- float textSize = a.getDimension(R.styleable.MyView_myTextSize, 33);
- paint.setTextSize(textSize);
- paint.setColor(textColor);
- a.recycle();
- }
- public MyView(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- paint.setStyle(Style.FILL);
- canvas.drawText("aaaaaaa", 10, 50, paint);
- }
- }
运行后:
没有评论:
发表评论