在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)
attrs.xml里面就是定义了Android的属性规则:
name为属性名称,format为类型
自己自定义属性:
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文件,来规则属性类型:
<?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);
}
}
效果图: