Android 自定義view (一)——attr 理解

前言:

自定義view是android自定義控件的核心之一,那麼在學習自定義view以前,咱們先來了解下自定義view的自定義屬性的attr的用法吧html

Android attr 是什麼

(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函數

Android attr 的做用

(1)attr 做用就是約束屬性數據類型,xml資源文件中定義各類attr,指定attr的數據類型。佈局

Android attr 的使用方式

(1) 在自定義View的構造函數中解析這些從XML中定義的屬性值,將其存放到View對應的成員變量中學習

(2) 在layout文件中爲自定義View的XML屬性賦值動畫

Android attr 的簡單建立

(1)咱們在res/values目錄下新建了一個名爲attrs_ysj.xml文件,文件名是什麼不重要,只要是xml文件就行。ui

(2)咱們在該文件中定義咱們自定義View所支持的XML屬性。

{DDF6D2A5-4999-6B4A-8A2D-6254D9E83946}

由圖可知該文件的根結點是<resources> </resources>,咱們在根節點下能夠添加多個子節點,在節點中經過name指定XML屬性名稱,經過format指定XML屬性值的類型,以下圖所示:

3029695F-4EE5-49F3-8110-E209928DC126

固然爲了方便理解format支持的數據類型,我在其餘地方找了一張圖片

2016030209164223

由上圖咱們可知,format支持的類型有enum、boolean、color、dimension、flag、float、fraction、integer、reference、string。

按照以上的方法咱們就能夠定義好本身的屬性以及相關的數據類型,接下來咱們看看怎麼簡單的使用

Android attr 屬性放入 styleable 節點中

首先要明確一點,attr不依賴於styleable,styleable只是爲了方便attr的使用。咱們能夠直接在resources文件中定義一些屬性,也能夠本身定義屬性放到styleable裏面。使用declare-styleable的方式有利於咱們咱們把相關的屬性組織起來,有一個分組的概念,屬性的使用範圍更加明確。

541682DB-5A93-453C-A739-BFBD369A382E

他們區別就是在自定義view中獲取屬性的方式有略微差別

若是直接使用attr定義,

D84785DB-6DD7-4E6D-AF6B-0CE35DFA7F71

定義一個attr就會在R文件裏面生成一個Id,那麼咱們去獲取這個屬性時。那麼獲取咱們自定義的相關屬性的方式爲:

int[] custom_attrs = {R.attr.viewText,R.viewTextColor,R.viewTextSize};
TypedArray typedArray = context.obtainStyledAttributes(set,custom_attrs);
 
若是本身定義屬性放到styleable裏面如styleable

3029695F-4EE5-49F3-8110-E209928DC126

經過定義一個styleable,咱們能夠在R文件裏自動生成一個int[],數組裏面的int就是定義在styleable裏面的attr的id。因此咱們在獲取屬性的時候就能夠直接使用styleable數組來獲取一系列的屬性。styleablestyleableattrstyleable那麼獲取咱們自定義的相關屬性的方式爲:
TypedArray typedArray = context.obtainStyledAttributes(set,R.styleable.YText);
 
由上面的例子能夠知道,定義一個,在獲取屬性的時候爲咱們自動提供了一個屬性數組。此外,使用的方式有利於咱們咱們把相關的屬性組織起來,有一個分組的概念,屬性的使用範圍更加明確。declare-styleabledeclare-styleable

format 數據類型參考

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" />

相關文章
相關標籤/搜索