在Android开发中,大多数都是用Android提供的属性,例如:

android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="40dp"

这些都是Android定义的,只是在使用Android定义的属性,现在我们自己来自定义属性

 

在自定义属性之前,先去了解Android是如何自定义属性的:需要找到SDK目录中(D:\tools\sdk\platforms\android-28\data\res\values)

Android自定义属性 android自定义属性详解_xml

attrs.xml里面就是定义了Android的属性规则:

name为属性名称,format为类型

Android自定义属性 android自定义属性详解_自定义属性_02

 

自己自定义属性:

myattribute:my_age="26"

myattribute:my_name="刀郎"

myattribute:my_bg="@mipmap/jtx"

注意:需要申请:xmlns:myattribute="http://schemas.android.com/apk/res-auto"

<!-- 自定义属性 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:myattribute="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    tools:context=".ShangGuiguTestActivity">

    <view.custom.shangguigucustomview.MyCustomAttribute
        myattribute:my_age="26"
        myattribute:my_name="刀郎"
        myattribute:my_bg="@mipmap/jtx"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

 编写 attrs.xml文件,来规则属性类型:

Android自定义属性 android自定义属性详解_xml_03

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="MyCustomAttribute">

        <attr name="my_age" format="integer" />
        <attr name="my_name" format="string" />
        <attr name="my_bg" format="reference" />

    </declare-styleable>

</resources>

 

使用自定义属性:

public class MyCustomAttribute extends View {

    private static final String TAG  = MyCustomAttribute.class.getSimpleName();

    private Paint paint;

    public MyCustomAttribute(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setAntiAlias(true); // 去锯齿
        paint.setTextSize(60);

        initView(context, attrs);
    }

    private int myage;
    private String myname;
    private Drawable mybg;

    private void initView(Context context, AttributeSet attributeSet) {

        // 1.通过命名控件来获取
        /*String age = attributeSet.getAttributeValue("http://schemas.android.com/apk/res-auto", "my_age");
        String name = attributeSet.getAttributeValue("http://schemas.android.com/apk/res-auto", "my_name");
        String bg = attributeSet.getAttributeValue("http://schemas.android.com/apk/res-auto", "my_bg");

        Log.i(TAG, "age:" + age + " name:" + name + " bg:" + bg);*/

        // 2.通过变量属性方式打印获取
        /*for (int i=0; i<attributeSet.getAttributeCount(); i++) {
            Log.i(TAG, "name:" + attributeSet.getAttributeName(i) + " value:" + attributeSet.getAttributeValue(i));
        }*/

        // 3.通过控件方式来获取,比较靠谱,这种方式才可以把图片显示
        TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.MyCustomAttribute);
        myage = typedArray.getInt(R.styleable.MyCustomAttribute_my_age, 0);
        myname = typedArray.getString(R.styleable.MyCustomAttribute_my_name);
        mybg = typedArray.getDrawable(R.styleable.MyCustomAttribute_my_bg);

        typedArray.recycle(); // 因为源码中是进行回收的

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // 测量 宽度  高度
        setMeasuredDimension(1200, 3000);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 绘制我的年龄相关信息
        canvas.drawText(String.valueOf(myage), 60, 100, paint);

        // 绘制我的名称相关信息
        canvas.drawText(myname, 60, 180, paint);

        // 绘制图片
        canvas.drawBitmap(((BitmapDrawable)mybg).getBitmap(), 60, 250, paint);
    }
}

 

 效果图:

Android自定义属性 android自定义属性详解_自定义属性_04