attr 在前一篇文章《Android 自定義view —— attr理解》已經簡單的進行了介紹和建立,那麼這篇文章就來一步步說說attr的簡單使用吧html
(1)首先建立attrs自定義屬性文件名稱,定義屬性以及相關數據類型android
(2)再次建立自定義view,而後讀取相關屬性完成須要的view相關佈局、繪製等工做面試
(3)最後在xml佈局文件中引用或者直接在代碼中new一個相關對象進行使用canvas
爲了可以簡單的練習演示attr 相關使用,我如今本身規定了以下需求android-studio
(1)定義view,將須要的屬性定義在 attr 中app
(2)在自定義view中 顯示文字、文字顏色、文字背景、文字大小eclipse
(3)在xml中引用或者在代碼中new一個對象進行使用ide
爲了方便理解,我將編寫順序進行調整佈局
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--name 是自定義屬性名,通常採用駝峯命名,能夠隨意。 format 是屬性的單位-->
<attr name="viewText" format="string" />
<attr name="viewTextColor" format="color" />
<attr name="viewTextSize" format="dimension" />
<!--name 是自定義控件的類名-->
<declare-styleable name="YText">
<attr name="viewText" />
<attr name="viewTextColor" />
<attr name="viewTextSize" />
<!--注意:通常狀況是按照上面這樣寫,把屬性單獨定義在上面,而後在styleable這裏面引用,可是我要裝一下逼,就單獨混寫在裏面了下,取值的時候就須要單獨去取名稱才能取到值否則是取不到值-->
<attr name="viewTextBg" format="color" />
</declare-styleable>
</resources>post
注意:關於attr裏面的屬性定義或者理解有疑惑請移步《Android 自定義view —— attr理解》
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--引用自定義view必須是包名.類名-->
<com.boyoi.ysj.custom.one.view.YView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
custom:viewText="這是個人自定義View"
custom:viewTextColor="@android:color/holo_red_dark"
custom:viewTextBg="@android:color/holo_blue_dark"
custom:viewTextSize="18sp" />
</LinearLayout>
哈哈在看了xml仍是先來補補點小知識點(不少時候會暈的,特別是面試這些小知識點搞很差你還真說不清楚)——命名空間中的 res/android 和 res-auto
xmlns:android=http://schemas.android.com/apk/res/android
xmlns:customview=http://schemas.android.com/apk/res-auto
注意:這2個實際上前者是就是讓你引用系統自帶屬性的,後者是讓你使用lib庫裏自定義屬性的。可是這個地方要注意,在eclipse中若是要使用你自定義的屬性 是不能用res-auto的必須得替換成你自定義view所屬的包名,若是你在剛好使用的自定義屬性被作成了lib那就只能使用res-auto了,而在android-studio裏,不管你是本身寫自定義view仍是引用的lib裏的自定義的view 都只能使用res-auto這個寫法。之前那個包名的寫法在android-studio裏是被廢棄沒法使用的。
/**
* Created by yishujun on 16/6/3.
*/
public class YView extends View {
private Context mContext;
//文本
private String mText;
//文本的顏色
private int mTextColor;
//文本的大小
private int mTextSize;
//文本的背景
private int mTextBg;
//繪製時控制文本繪製的範圍
private Rect mBound;
//繪製文本畫筆
private Paint mPaint;
public YView(Context context) {
this(context, null);
}
public YView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public YView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
typedYView(attrs, defStyleAttr);
}
/**
* 得到咱們所定義的自定義樣式屬性
*
* @param attrs
* @param defStyleAttr
*/
private void typedYView(AttributeSet attrs, int defStyleAttr) {
//得到咱們所定義的自定義樣式屬性
//final Resources.Theme theme = mContext.getTheme();
//TypedArray a = theme.obtainStyledAttributes(attrs,R.styleable.YText, defStyleAttr, 0);
//獲取自定義屬性值的方式通常狀況分爲兩種:styleable組 和 直接獲取attr屬性
//這裏獲取的屬性用的styleable組,同時我也建議用這種方式方便規範attrs文件,
//另一種獲取方式以下,固然也能夠一個個獲取屬性值,這裏再也不演示
//int[] custom = {R.attr.viewText, R.attr.viewTextSize};
//TypedArray a = mContext.obtainStyledAttributes(attrs, custom);
TypedArray a = mContext.getTheme().obtainStyledAttributes(attrs, R.styleable.YText, defStyleAttr, 0);
int n = a.getIndexCount();
for (int i = 0; i <= n; i++) {
int attr = a.getIndex(i);
switch (attr) {
//注意獲取屬性的方式爲 styleable的名稱_屬性名稱
case R.styleable.YText_viewText:
mText = a.getString(attr);
break;
case R.styleable.YText_viewTextColor:
// 默認顏色設置爲黑色
mTextColor = a.getColor(attr, Color.BLACK);
break;
case R.styleable.YText_viewTextSize:
// 默認設置爲16sp,TypeValue也能夠把sp轉化爲px
mTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, 18, getResources().getDisplayMetrics()));
break;
case R.styleable.YText_viewTextBg:
// 默認顏色設置爲黃色
mTextBg = a.getColor(attr, Color.YELLOW);
//可是在這裏上面的那種取值方式就是取不到值哦,由於返回後的attr沒有YText_viewTextBg,緣由是由於我剛裝逼了一下,因此咱們要單獨去取值
break;
}
}
//記得在這裏單獨取出文本的背景mTextBg值哦,由於上面的mTextBg取不到值哦
mTextBg = a.getColor(R.styleable.YText_viewTextBg, Color.YELLOW);
//回收資源
a.recycle();
//新建畫筆對象
mPaint = new Paint();
//設置畫筆
mPaint.setTextSize(mTextSize);
mBound = new Rect();
//設置畫筆繪製文字及相關區域
mPaint.getTextBounds(mText, 0, mText.length(), mBound);
this.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mText = "你摸了我一下";
//刷新畫布
postInvalidate();
}
});
}
@Override
protected void onDraw(Canvas canvas) {
//設置畫布顏色即文字背景色
mPaint.setColor(mTextBg);
//繪製背景,全屏
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);
//設置文字顏色
mPaint.setColor(mTextColor);
//繪製文字
canvas.drawText(mText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);
}
}
怎樣一個簡單的自定義view不就完成了嘛,是否是看起來很簡單,對的是很簡單,可是對我來講還有不少東西是須要去深究那麼