標籤:
還是前面例子中的問題,如果想在xml中設定球的半徑,應該怎麼辦?我們先瞭解下自訂屬性的知識。
一、屬性檔案中format
首先我們要查看values目錄下是否有attrs.xml,如果沒有要建立一個。
format可選項
reference //引用
color
boolean
dimension /尺寸
float
integer
string
fraction //百分數,如200%
下面再自訂幾個屬性,在attrs.xml檔案中,如下
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="BallView"> <attr name="BallColor" format="color"/> <attr name="BallRadius" format="float"/> <attr name="BallStartX" format="float"/> <attr name="BallStartY" format="float"/> </declare-styleable></resources>
其中BallView中用來在java代碼中找到這些資料。
布局檔案中如下
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <chuiyuan.lsj.androidjava.utils.BallView2 xmlns:ballview="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" ballview:BallRadius="20" /></LinearLayout>
注意BallView2中的xmlns,使用的是res-auto。
二、樣本
接下來是BallView2的代碼,建構函式是重點,我們擷取定義的屬性,擷取方法後面通常會設定預設值,以免我們在xml檔案中沒有定義。擷取屬性使用 名字_屬性 串連起來。TypedArray通常最後調用 recycle()方法,以保持以後使用屬性時的一致性。
package chuiyuan.lsj.androidjava.utils;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import chuiyuan.lsj.androidjava.R;/** * Created by lsj on 2015/9/26.e */public class BallView2 extends View{ private float x ; private float y ; private float r ; private int color ; public BallView2(Context context){ super(context, null); } public BallView2(Context context, AttributeSet attrs){ super(context, attrs); //得到自訂的屬性 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.BallView) ; //在xml沒有定義這個屬性時,使用預設值 30 x = ta.getFloat(R.styleable.BallView_BallStartX,30) ; y = ta.getFloat(R.styleable.BallView_BallStartY,30); r = ta.getFloat(R.styleable.BallView_BallRadius,30); color = ta.getColor(R.styleable.BallView_BallColor, Color.GREEN); ta.recycle(); //一定要 } @Override public void onDraw(Canvas canvas){ Paint paint = new Paint() ; paint.setColor(color); canvas.drawCircle(x, y, r, paint); } @Override public boolean onTouchEvent(MotionEvent event){ x = event.getX(); y = event.getY(); invalidate(); //重新整理 return true; //成功 }}
結束 。。
Android自訂控制項之自訂屬性的添加 -(2)