自定義view是android自定義控件的核心之一,那麼在學習自定義view以前,咱們先來了解下自定義view的自定義屬性的attr的用法吧html
(1)attr 的簡單理解就是一個屬性約束,約束具體屬性字段的屬性的數據類型(boolean、string、float…)android
(2)attr的文件名稱不是固定的,只是方便理解和規範,也能夠是其餘名稱,好比arrt、aesa…api
(3)其實咱們常常在使用,好比咱們界面的佈局文件,從狹隘的方面理解只要用xml形式文件就涉及到約束,而attr就是其中的一種約束文件(相似Schema)而已數組
(4)若是要深刻理解請你們去簡單瞭解 XML DTD和XML Schema(我大學選修課),這裏就不帶你們去理解了。app
(5)這裏給出兩個參考網址:http://blog.chinaunix.net/uid-7308906-id-2059766.html ,http://blog.csdn.net/sunxing007/article/details/5684265函數
(1)attr 做用就是約束屬性數據類型,xml資源文件中定義各類attr
,指定attr
的數據類型。佈局
(1) 在自定義View的構造函數中解析這些從XML中定義的屬性值,將其存放到View對應的成員變量中學習
(2) 在layout文件中爲自定義View的XML屬性賦值動畫
(1)咱們在res/values目錄下新建了一個名爲attrs_ysj.xml文件,文件名是什麼不重要,只要是xml文件就行。ui
(2)咱們在該文件中定義咱們自定義View所支持的XML屬性。
由圖可知該文件的根結點是<resources> </resources>,咱們在根節點下能夠添加多個子節點,在
節點中經過
name
指定XML屬性名稱,經過format
指定XML屬性值的類型,以下圖所示:
固然爲了方便理解format支持的數據類型,我在其餘地方找了一張圖片
由上圖咱們可知,format支持的類型有enum、boolean、color、dimension、flag、float、fraction、integer、reference、string。
按照以上的方法咱們就能夠定義好本身的屬性以及相關的數據類型,接下來咱們看看怎麼簡單的使用
首先要明確一點,attr
不依賴於styleable
,styleable
只是爲了方便attr
的使用。咱們能夠直接在resources文件中定義一些屬性,也能夠本身定義屬性放到styleable
裏面。使用declare-styleable
的方式有利於咱們咱們把相關的屬性組織起來,有一個分組的概念,屬性的使用範圍更加明確。
若是直接使用attr定義,
定義一個attr
就會在R文件裏面生成一個Id,那麼咱們去獲取這個屬性時。那麼獲取咱們自定義的相關屬性的方式爲:
int[] custom_attrs = {R.attr.viewText,R.viewTextColor,R.viewTextSize}; TypedArray typedArray = context.obtainStyledAttributes(set,custom_attrs);
若是本身定義屬性放到styleable
裏面如styleable
經過定義一個styleable
,咱們能夠在R文件裏自動生成一個int[],數組裏面的int就是定義在styleable
裏面的attr
的id。因此咱們在獲取屬性的時候就能夠直接使用styleable
數組來獲取一系列的屬性。styleablestyleableattrstyleable那麼獲取咱們自定義的相關屬性的方式爲:
TypedArray typedArray = context.obtainStyledAttributes(set,R.styleable.YText);
由上面的例子能夠知道,定義一個,在獲取屬性的時候爲咱們自動提供了一個屬性數組。此外,使用的方式有利於咱們咱們把相關的屬性組織起來,有一個分組的概念,屬性的使用範圍更加明確。declare-styleabledeclare-styleable
1. reference:參考某一資源ID。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "background" format = "reference" />
</declare-styleable>
(2)屬性使用:
<ImageView
android:layout_width = "42dip"
android:layout_height = "42dip"
android:background = "@drawable/圖片ID"
/>
2. color:顏色值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "textColor" format = "color" />
</declare-styleable>
(2)屬性使用:
<TextView
android:layout_width = "42dip"
android:layout_height = "42dip"
android:textColor = "#00FF00"
/>
3. boolean:布爾值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "focusable" format = "boolean" />
</declare-styleable>
(2)屬性使用:
<Button
android:layout_width = "42dip"
android:layout_height = "42dip"
android:focusable = "true"
/>
4. dimension:尺寸值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "layout_width" format = "dimension" />
</declare-styleable>
(2)屬性使用:
<Button
android:layout_width = "42dip"
android:layout_height = "42dip"
/>
5. float:浮點值。
(1)屬性定義:
<declare-styleable name = "AlphaAnimation">
<attr name = "fromAlpha" format = "float" />
<attr name = "toAlpha" format = "float" />
</declare-styleable>
(2)屬性使用:
<alpha
android:fromAlpha = "1.0"
android:toAlpha = "0.7"
/>
6. integer:整型值。
(1)屬性定義:
<declare-styleable name = "AnimatedRotateDrawable">
<attr name = "visible" />
<attr name = "frameDuration" format="integer" />
<attr name = "framesCount" format="integer" />
<attr name = "pivotX" />
<attr name = "pivotY" />
<attr name = "drawable" />
</declare-styleable>
(2)屬性使用:
<animated-rotate
xmlns:android = "http://schemas.android.com/apk/res/android"
android:drawable = "@drawable/圖片ID"
android:pivotX = "50%"
android:pivotY = "50%"
android:framesCount = "12"
android:frameDuration = "100"
/>
7. string:字符串。
(1)屬性定義:
<declare-styleable name = "MapView">
<attr name = "apiKey" format = "string" />
</declare-styleable>
(2)屬性使用:
<com.google.android.maps.MapView
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
/>
8. fraction:百分數。
(1)屬性定義:
<declare-styleable name="RotateDrawable">
<attr name = "visible" />
<attr name = "fromDegrees" format = "float" />
<attr name = "toDegrees" format = "float" />
<attr name = "pivotX" format = "fraction" />
<attr name = "pivotY" format = "fraction" />
<attr name = "drawable" />
</declare-styleable>
(2)屬性使用:
<rotate
xmlns:android = "http://schemas.android.com/apk/res/android"
android:interpolator = "@anim/動畫ID"
android:fromDegrees = "0"
android:toDegrees = "360"
android:pivotX = "200%"
android:pivotY = "300%"
android:duration = "5000"
android:repeatMode = "restart"
android:repeatCount = "infinite"
/>
9. enum:枚舉值。
(1)屬性定義:
<declare-styleable name="名稱">
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
(2)屬性使用:
<LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
>
</LinearLayout>
10. flag:位或運算。
(1)屬性定義:
<declare-styleable name="名稱">
<attr name="windowSoftInputMode">
<flag name = "stateUnspecified" value = "0" />
<flag name = "stateUnchanged" value = "1" />
<flag name = "stateHidden" value = "2" />
<flag name = "stateAlwaysHidden" value = "3" />
<flag name = "stateVisible" value = "4" />
<flag name = "stateAlwaysVisible" value = "5" />
<flag name = "adjustUnspecified" value = "0x00" />
<flag name = "adjustResize" value = "0x10" />
<flag name = "adjustPan" value = "0x20" />
<flag name = "adjustNothing" value = "0x30" />
</attr>
</declare-styleable>
(2)屬性使用:
<activity
android:name = ".StyleAndThemeActivity"
android:label = "@string/app_name"
android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意:
屬性定義時能夠指定多種類型值。
(1)屬性定義:
<declare-styleable name = "名稱">
<attr name = "background" format = "reference|color" />
</declare-styleable>
(2)屬性使用:
<ImageView
android:layout_width = "42dip"
android:layout_height = "42dip"
android:background = "@drawable/圖片ID|#00FF00" />