Android中自定义属性

参考
http://www.android100.org/html/201406/07/20422.html
http://blog.csdn.net/ouyangtianhan/article/details/6573958
http://blog.csdn.net/lmj623565791/article/details/45022631/

1、在xml中除了可以用Android:attr=”“的方法设置属性,还可以自己定义属性
(1)在res/values文件下定义一个attrs.xml文件

<?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> 

其中resouce是跟标签,可以在里面定义若干个declare-styleable,中name定义了变量的名称,下面可以再自定义多个属性,针对来说,其属性的名称为“myTextSize”,format指定了该属性类型为dimension,表示的是字体的尺寸,format还可以指定其他的类型:
reference 表示引用,参考某一资源ID
string 表示字符串
color 表示颜色值
dimension 表示尺寸值
boolean 表示布尔值
integer 表示整型值
float 表示浮点值
fraction 表示百分数
enum 表示枚举值
flag 表示位运算

(2)在 布局文件中定义

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello_world" />
    <com.example.administrator.myview.MyView
        android:layout_width="100dp"
        android:layout_height="200dp"
        myapp:myColor="#786"
        myapp:myTextSize="20px"/>
</LinearLayout>

其中com.example.administrator.myview.MyView就是我的MyView.java(后面会贴代码)所在路径,另外”myapp”可以自己定义,但是在开头必须要声明

(3)在java文件中的说明(MyView.java)

package com.example.administrator.myview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

/**1
 * Created by Administrator on 2016/7/18.
 */
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, 0045);
        float textSize = a.getDimension(R.styleable.MyView_myTextSize, 80);
        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(Paint.Style.FILL);
        canvas.drawText("aaaaaaa", 10, 50, paint);
    }
}

其中attrs和ArrayType都是属性集,但是两者是有区别的,attrs和ArrayType都可以通过getAttributeName()和getAttributeValue()方法获得属性的key和value,但是如果布局文件中出现类似这样的引用:

<com.example.test.MyTextView
        android:layout_width="@dimen/dp100"
        android:layout_height="@dimen/dp200"
        zhy:testAttr="520"
        zhy:text="@string/hello_world" />

那么输出的结果将会是:

MyTextView(4692): attrName = layout_width , attrVal = @2131165234
MyTextView(4692): attrName = layout_height , attrVal = @2131165235
MyTextView(4692): attrName = text , attrVal = @2131361809
MyTextView(4692): attrName = testAttr , attrVal = 520

但是如果用的是TypeArray,显示的将是具体的值:
MyTextView(4692): text = Hello world! , textAttr = 520

TypedArray其实是用来简化我们的工作的,比如上例,如果布局中的属性的值是引用类型(比如:@dimen/dp100),如果使用AttributeSet去获得最终的像素值,那么需要第一步拿到id,第二步再去解析id。而TypedArray正是帮我们简化了这个过程。

另外要注意的就是:
在MyView.Java 代码,其中构造方法是重点,我们获取定义的属性我们R.sytleable.MyView_textColor, 获取方法中后面通常设定默认值(float textSize = a.getDimension(R.styleable.MyView_textSize, 36 ); ), 防止我们在xml 文件中没有定义.从而使用默认值!
获取,MyView 就是定义在 里的 名字,获取里面属性用 名字_ 属性 连接起来就可以.TypedArray 通常最后调用 .recycle() 方法,为了保持以后使用该属性一致性!

(3)MainActivity.java其实就是简单的加载我们的布局就可以了:

package com.example.administrator.myview;

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

最后运行结果是:这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值