Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用
一、?在res/values?文件下定義一個(gè)attrs.xml?文件.代碼如下:
- <?xml?version="1.0"?encoding="utf-8"?> ?
- <resources>??
- ????<declare-styleable?name="MyView">??
- ????????<attr?name="textColor"?format="color"?/>??
- ????????<attr?name="textSize"?format="dimension"?/>??
- ????</declare-styleable>??
- </resources> ?
二、?我們?cè)?strong>MyView.java?代碼編寫如下,其中下面的構(gòu)造方法是重點(diǎn),我們獲取定義的屬性R.sytleable.MyView_textColor,?獲取方法中后面通常設(shè)定默認(rèn)值(float textSize = a.getDimension(R.styleable.MyView_textSize,?36?);?),?防止我們?cè)?strong>xml?文件中沒(méi)有定義.從而使用默認(rèn)值!
MyView?就是定義在<declare-styleable name="MyView?"></declare-styleable>?里的 名字,獲取里面屬性用?名字_ 屬性?連接起來(lái)就可以.TypedArray?通常最后調(diào)用?.recycle()?方法,為了保持以后使用該屬性一致性!
- public?MyView(Context?context,AttributeSet?attrs)??
- ????{??
- ????????super(context,attrs);??
- ????????mPaint?=?new?Paint();??
- ??????????
- ????????TypedArray?a?=?context.obtainStyledAttributes(attrs,??
- ????????????????R.styleable.MyView);??
- ??????????
- ????????int?textColor?=?a.getColor(R.styleable.MyView_textColor,??
- ????????????????0XFFFFFFFF);??
- ????????float?textSize?=?a.getDimension(R.styleable.MyView_textSize,?36);??
- ??????????
- ????????mPaint.setTextSize(textSize);??
- ????????mPaint.setColor(textColor);??
- ??????????
- ????????a.recycle();??
- ????} ?
MyView.java??MyView控件全部代碼如下?
- public?class?MyView?extends?View?{??
- ????private?Paint?mPaint;??
- ????private?Context?mContext;??
- ????private?static?final?String?mString?=?"Welcome?to?Mr?Wei's?blog";??
- ??????
- ????public?MyView(Context?context)?{??
- ????????super(context);??
- ????????mPaint?=?new?Paint();??
- ????}??
- ????public?MyView(Context?context,AttributeSet?attrs)??
- ????{??
- ????????super(context,attrs);??
- ????????mPaint?=?new?Paint();??
- ??????????
- ????????TypedArray?a?=?context.obtainStyledAttributes(attrs,??
- ????????????????R.styleable.MyView);??
- ??????????
- ????????int?textColor?=?a.getColor(R.styleable.MyView_textColor,??
- ????????????????0XFFFFFFFF);??
- ????????float?textSize?=?a.getDimension(R.styleable.MyView_textSize,?36);??
- ??????????
- ????????mPaint.setTextSize(textSize);??
- ????????mPaint.setColor(textColor);??
- ??????????
- ????????a.recycle();??
- ????}??
- ????@Override??
- ????protected?void?onDraw(Canvas?canvas)?{??
- ????????//?TODO?Auto-generated?method?stub??
- ????????super.onDraw(canvas);??
- ????????//設(shè)置填充??
- ????????mPaint.setStyle(Style.FILL);??
- ??????????
- ????????//畫一個(gè)矩形,前倆個(gè)是矩形左上角坐標(biāo),后面?zhèn)z個(gè)是右下角坐標(biāo)??
- ????????canvas.drawRect(new?Rect(10,?10,?100,?100),?mPaint);??
- ??????????
- ????????mPaint.setColor(Color.BLUE);??
- ????????//繪制文字??
- ????????canvas.drawText(mString,?10,?110,?mPaint);??
- ????}??
- } ?
三、將我們自定義的MyView?加入布局main.xml?文件中,并且使用自定義屬性,自定義屬性必須加上:
?? ?"?xmlns:test?="http://schemas.android.com/apk/res/com.android.tutor" ?,test是自定義屬性的前綴,com.android.tutor?是我們包名.
main.xml?全部代碼如下:
- <?xml???
- version="1.0"?encoding="utf-8"?>??
- <LinearLayout???
- xmlns:android="http://schemas.android.com/apk/res/android"??
- ????????????????
- xmlns:test="http://schemas.android.com/apk/res/com.android.tutor"??
- ????android:orientation="vertical"??
- ????android:layout_width="fill_parent"??
- ????android:layout_height="fill_parent"??
- ????>??
- <TextView????
- ????android:layout_width="fill_parent"???
- ????android:layout_height="wrap_content"???
- ????android:text="@string/hello"??
- ????/>??
- <com.android.tutor.MyView??
- ????android:layout_width="fill_parent"???
- ????android:layout_height="fill_parent"???
- ????test:textSize="20px"??
- ????test:textColor="#fff"??
- />??
- </LinearLayout> ?
?
format就是格式,里面的就是這個(gè)屬性對(duì)應(yīng)的格式,下面列出來(lái)大致的格式有:
?
1. reference:參考某一資源ID,以此類推
(1)屬性定義:
?
?
?
(2)屬性使用:
<imageview< p="">
android:layout_width = "42dip"
android:layout_height = "42dip"
android:background = "@drawable/圖片ID"
/>
2. color:顏色值
?
?
?
3. boolean:布爾值
?
?
?
4. dimension:尺寸值。注意,這里如果是dp那就會(huì)做像素轉(zhuǎn)換
?
?
?
5. float:浮點(diǎn)值。
6. integer:整型值。
7. string:字符串
8. fraction:百分?jǐn)?shù)。
9. enum:枚舉值
10. flag:是自己定義的,類似于 android:gravity="top",就是里面對(duì)應(yīng)了自己的屬性值。
11. reference|color:顏色的資源文件。 12.reference|boolean:布爾值的資源文件
注意://由于reference是從資源文件中獲取:所以在XML文件中寫這個(gè)屬性的時(shí)候必須personattr:name="@string/app_name"這種格式,否則會(huì)出錯(cuò)
轉(zhuǎn)載于:https://www.cnblogs.com/lianghui66/p/4074143.html
總結(jié)
以上是生活随笔為你收集整理的Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: EditPlus集成Java编译和运行命
- 下一篇: 关于PCA算法的一点学习总结