編輯:關於Android編程
上一篇Android自定義控件系列一:如何測量控件尺寸 我們講了如何確定控件的屬性,這篇接著也是講個必要的知識-如何自定義屬性。對於一個完整的或者說真正有實用價值的控件,自定義屬性是必不可少的。
如何為控件定義屬性
在res/values/attrs.xml(attrs.xml如果不存在,可以創建個)中使用
01.
xml
version
=
1.0
encoding
=
utf-8
?>
02.
<
resources
>
03.
<
declare-styleable
name
=
avatarimageview
>
04.
<
attr
name
=
src
format
=
reference
/>
05.
<
attr
name
=
border
format
=
dimension
/>
06.
<
attr
name
=
borderColor
format
=
reference|color
/>
07.
<
attr
name
=
borderAlpha
format
=
integer
/>
08.
declare-styleable
>
09.
resources
>
name=avatarimageview指定這組屬性的名稱,一般可以寫成控件名稱,標識這些屬性是某個控件的。定義具體的屬性,如src--定義圖片的來源,border--定義控件的邊框大小,borderColor--邊框顏色等等。format指定屬性值的類型,reference是引用類型,如引用圖片、引用顏色、引用文字等。dimension是dp值。integer是整形。color是顏色編碼,如果顏色編碼是在colors.xml中定義的,此時要用reference,如果倆種方式都支持,中間用豎線分割。
如何獲得屬性值
屬性的定義實際上是為了構建控件的,如上例,只有通過src拿到圖片才能畫,只有拿到border,才知道我要畫多大的邊框,所以在實例化控件之前必須能夠獲得屬性及屬性值。
為此我們必須要重寫View的倆個構造方法,通過AttributeSet參數獲得屬性值:
View(Context context)
Simple constructor to use when creating a view from code.
用於通過java代碼實例化控件時使用
View(Context context, AttributeSet attrs)
Constructor that is called when inflating a view from XML.
用於在布局文件中,通過xml代碼創建的控件
對於第一個構造方法,完全可以通過setXXX()來注入屬性,對於上面的屬性定義是沒有意義,我們著重說下如何獲得布局文件中的屬性值。
01.
public
AvatarImageView(Context context, AttributeSet attrs) {
02.
super
(context, attrs);
03.
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.avatarimageview);
04.
src = a.getResourceId(R.styleable.avatarimageview_src,
0
);
05.
if
(src !=
0
)
06.
bitmap = BitmapFactory.decodeResource(
this
.getResources(), src);
07.
08.
border = (
int
)a.getDimension(R.styleable.avatarimageview_border, dip2px(
this
.getContext(),
6
));
09.
10.
borderColor = (
int
)a.getColor(R.styleable.avatarimageview_borderColor,
0
);
11.
if
(borderColor ==
0
)
12.
borderColor = a.getResourceId(R.styleable.avatarimageview_borderColor,
0
);
13.
if
(borderColor ==
0
)
14.
borderColor =
0x9F7A97EA
;
15.
16.
borderAlpha = a.getInt(R.styleable.avatarimageview_borderAlpha, -
1
);
17.
}
通過obtainStyledAttributes()方法獲得名稱avatarimageview下的所有屬性的集合TypedArray。通過TypedArray就可以獲得具體的屬性值了。如上面代碼。
如何在布局文件中使用屬性
01.
xml
version
=
1.0
encoding
=
utf-8
?>
02.
<
LinearLayout
xmlns:android
=
http://schemas.android.com/apk/res/android
03.
xmlns:my
=
http://schemas.android.com/apk/res/com.kanyuan.avatarimageview
04.
android:layout_width
=
match_parent
05.
android:layout_height
=
match_parent
06.
android:orientation
=
vertical
07.
android:gravity
=
center
>
08.
<
LinearLayout
android:layout_width
=
wrap_content
android:layout_height
=
wrap_content
android:orientation
=
vertical
>
09.
<
com.kanyuan.avatarimageview.AvatarImageView
android:id
=
@+id/avatarImageView
my:src
=
@drawable/head
my:border
=
2dp
android:layout_width
=
200dp
android:layout_height
=
200dp
/>
10.
<
Button
android:layout_width
=
wrap_content
android:layout_height
=
wrap_content
android:layout_marginTop
=
20dp
android:text
=
改變頭像
android:onClick
=
changeAvatar
/>
11.
LinearLayout
>
12.
13.
LinearLayout
>
假如我的控件定義在了com.kanyuan.avatarimageview包下。
首先要引入命名空間:xmlns:命名空間名稱=http://schemas.android.com/apk/res/app的包名,然後通過這個命名空間引用屬性,如:my:src=@drawable/head、my:border=2dp。之後就可以在構造方法中獲得屬性值了。
這樣就和上篇的測量尺寸的文章接上了,通過獲得padding、border等屬性來計算控件實際需要多大的空間。
具體關於這個頭像控件的完整源碼 http://download.csdn.net/detail/shimiso/9217237
Bitmap bitmap1; Bitmap bitmap2; Bitmap bitmap3 = Bitmap.createBitmap(bitmap1.getWidth
1、Kotlin介紹 [Kotlin](https://kotlinlang.org/) Kotlin是一門基於JVM的編程語言,它正成長為Android開發中用於替代J
一、前言如果你英文不錯建議你去官網看,官網底部也有翻譯語言選擇。官網地址:http://developer.android.com/preview/api-overvie
本文實例總結了 Android中Notification用法。分享給大家供大家參考,具體如下:我們在用手機的時候,如果來了短信,而我們沒有點擊查看的話,是不是在手機的最上