自定义View-获取自定义属性

    大家好,我叫Sincerly ,是一名Android Coder 俗称码农,我也是刚刚接触博客,写的不好的地方见谅。本篇文章重点是如何在自定义View中创建并使用自定义属性。

                                                事业无穷年。@dq —— 韩愈
什么是自定义属性?

我们来看一个官方View的使用

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

</RelativeLayout>

自定义属性的好处就是在xml中去决定属性,打个比方 这里text 想要做成一个公共的组件就必须把text属性抽出来,这样不用每次去java代码里边改text。

开始自定义,老规矩创建一个项目,建一个view包,然后再View包下边创建MyView.class

public class MyView extends View {
    public MyView(Context context) {
        this(context,null);
    }

    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyView(Context context, AttributeSet attrs, 
                int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    private void init(Context context,AttributeSet attrs){
        //待处理
    }

在values里边创建一个attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="My">
        <attr name="size" format="integer"/>
        <attr name="color" format="color" />
        <attr name="onTouch" format="boolean"/>
        <attr name="displayStyle" format="integer">
            <enum name="normal" value="0"/>
            <enum name="bold" value="1"/>
            <enum name="italic" value="2"/>
        </attr>
        <attr name="textStyle" format="integer">
            <flag name="normal" value="0"/>
            <flag name="bold" value="1"/>
            <flag name="italic" value="2"/>
        </attr>
        <attr name="shade" format="dimension"/>
        <attr name="alpha" format="float"/>
        <attr name="percent" format="fraction"/>
        <attr name="bg" format="reference"/>
        <attr name="title" format="string"/>
    </declare-styleable>
</resources>
创建节点 declare-styleable 这个节点将用来存放自定义属性。然后name命名为My,刚接触的朋友们 可能会说什么鬼,,下面来逐个解释:
<attr name="title" format="string">

name为自定义的名字 fromat是该属性的类型
android中给提供的format有10种属性:

///////////////////////////////////////////////////////////
/////  自定义View类型
///////////////////////////////////////////////////////////

    //1,integer   整型    521
    //2,color     颜色值   #545454
    //3,boolean   布尔型   true/false
    //4,dimension 单位型   10dp/20px
    //5,enum      枚举     *枚举值 多值选一
    //6,flag      标识     *位或运算 多值组合
    //7,float     浮点型   1.0f
    //8,fraction  百分数型  100%
    //9,reference 资源型   dimens/style/drawable..
    //10,string   字符串型  "hello!"

private void init(Context context,AttributeSet attrs){
        TypedArray arry=context.obtainStyledAttributes(attrs,
                        R.styleable.MyView);
        //第一种方式     
        int size=arry.getInteger(R.styleable.MyView_size,0);
        //第一种方式另一种形态(推荐,官方写法)
        final int count=arry.getIndexCount();
        for(int i=0;i<count;i++){
            int index=arry.getIndex(i);
            switch (index){
                case R.styleable.MyView_size:
                    //如果没有设置属性,就给一个default Value
                    int tsize=arry.getInteger(index,0);
                    break;
                case R.styleable.MyView_color:
                    int color=arry.getColor(index,Color.BLUE);
                    showLog(color+"");
                    break;
                case R.styleable.MyView_onTouch:
                    boolean normal=arry.getBoolean(index,true);
                    break;
                case R.styleable.MyView_displayStyle:
                    //enum
                    int displayStyle=arry.getInt(index,0);
                    if(displayStyle!=0){
                        //证明不是normal
                    }   
                    break;
                case R.styleable.MyView_textStyle:
                    //flag  normal|Itsatic
                    int textStyle=arry.getInt(index,0);
                    break;
                case R.styleable.MyView_shade:
                    int px=arry.getDimensionPixelSize(index
                            ,100);
                    break;
                case R.styleable.MyView_alpha:
                    float alpha=arry.getFloat(index,1.0f);
                    break;
                case R.styleable.MyView_percent:
                    //getFraction(int index, int base, int pbase, float defValue)
                    //如果值为10% 则 percent=10%*base
                    //如果值格式为10%p,percent=10%*pbase
                    float percent=arry.getFraction(index,1,1,0);
                    break;
                case R.styleable.MyView_bg:
                    int resouceId=arry.getResourceId(index
                    ,R.mipmap.ic_launcher);
                    break;
                case R.styleable.MyView_title:
                    String title=arry.getString(index);
                    showLog(title);
                    break;
            }
        }

        //第二种方法  通过命名空间获取属性
        String = "http://schemas.android.com/apk/res-auto";
        int color = attrs.getAttributeIntValue(space
                    ,"color", Color.BLACK);
        int size2 = attrs.getAttributeIntValue(space, "size", 10);
        String title = attrs.getAttributeValue(space, "title");

        arry.recycle();
    }

上面是两种获取方法,然后我们在xml中使用

根布局加上命名空间
Andorid Studio:
xmlns:my=”http://schemas.android.com/apk/res-auto”
Eclipse:
xmlns:my=”http://schemas.android.com/apk/res/包名”

    <com.tgl.myjni.view.MyView
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        my:size="24"
        my:color="#456"
        my:onTouch="true"
        my:shade="5dp"
        my:alpha="0.5"
        my:percent="100%"
        my:displayStyle="bold"
        my:textStyle="bold|normal"
        my:bg="@mipmap/ic_launcher"
        my:title="Hello,world!"/>

有细心的小伙伴发现了 根本my:根本点不出来 使劲点你也点不出来,这个时候改一个地方,
这里写图片描述

把这个name值改成和你的自定义View类名保持一致就ok了 没有的话 编译一下。
同理 MyView里边的styleable 也需要修改,run一下

02-28 04:15:38.946 4936-4936/? E/tag: title:Hello,world!
02-28 04:15:38.946 4936-4936/? E/tag: alpha:0.5
02-28 04:15:38.946 4936-4936/? E/tag: color:-12298906
02-28 04:15:38.946 4936-4936/? E/tag: size:24
02-28 04:15:38.946 4936-4936/? E/tag: onTouch:true
02-28 04:15:38.946 4936-4936/? E/tag: displayStyle:1
02-28 04:15:38.946 4936-4936/? E/tag: textStyle:1
02-28 04:15:38.946 4936-4936/? E/tag: shade:18
02-28 04:15:38.946 4936-4936/? E/tag: percent:1.0
02-28 04:15:38.946 4936-4936/? E/tag: resouceId:2130903040

完毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值