Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義控件系列二:如何自定義屬性

Android自定義控件系列二:如何自定義屬性

編輯:關於Android編程

上一篇Android自定義控件系列一:如何測量控件尺寸 我們講了如何確定控件的屬性,這篇接著也是講個必要的知識-如何自定義屬性。對於一個完整的或者說真正有實用價值的控件,自定義屬性是必不可少的。

 

如何為控件定義屬性

 

在res/values/attrs.xml(attrs.xml如果不存在,可以創建個)中使用標簽定義屬性,比如我想定義個顯示頭像的圓形的圖片控件(AvatarImageView):

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/android03.xmlns:my=http://schemas.android.com/apk/res/com.kanyuan.avatarimageview04.android:layout_width=match_parent05.android:layout_height=match_parent06.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

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved