TypedArray的作用:
Container for an array of values that were retrieved with obtainStyledAttributes(AttributeSet, int[], int, int) or obtainAttributes(AttributeSet, int[]). Be sure to call recycle() when done with them. The indices used to retrieve values from this structure correspond to the positions of the attributes given to obtainStyledAttributes.
是一個用於存放恢復obtainStyledAttributes(AttributeSet,
int[], int, int)或 obtainAttributes(AttributeSet,
int[])
值的一個數組容器,當操作完成以後,一定要調用recycle()方法。用於檢索的索引值在這個結構對應的位置給obtainStyledAttributes屬性。
使用這個類的時候,先要在valuse文件夾下創建:atts.xml文件:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <declare-styleable name="FlowIndicator">
- <attr name="count" format="integer" />
- <attr name="space" format="dimension" />
- <attr name="point_size" format="dimension" />
- <attr name="point_seleted_color" format="color|reference" />
- <attr name="point_normal_color" format="color|reference" />
- <attr name="point_radius" format="dimension" />
- </declare-styleable>
- </resources>
自定義屬性的format,可以有以下多種:
- reference
- string
- color
- dimension
- boolean
- integer
- float
- fraction
- enum
- flag
然後這樣使用:
- public FlowIndicator(Context context, AttributeSet attrs) {
- super(context, attrs);
- //獲得實例
- TypedArray typeArray = context.obtainStyledAttributes(attrs,
- R.styleable.FlowIndicator);
- //從typeArray獲取相應值,第二個參數爲默認值,如第一個參數在atts.xml中沒有定義,返回第二個參數值
- count = typeArray.getInteger(R.styleable.FlowIndicator_count, 4);
- space = typeArray.getDimension(R.styleable.FlowIndicator_space, 9);
- radius = typeArray.getDimension(R.styleable.FlowIndicator_point_radius, 9);
- point_normal_color = typeArray.getColor(
- R.styleable.FlowIndicator_point_normal_color, 0x000000);
- point_seleted_color = typeArray.getColor(
- R.styleable.FlowIndicator_point_seleted_color, 0xffff07);
- int sum = attrs.getAttributeCount();
- if (Constans.DEBUG) {
- String str = "";
- for (int i = 0; i < sum; i++) {
- String name = attrs.getAttributeName(i);
- String value = attrs.getAttributeValue(i);
- str += "attr_name :" + name + ": " + value + "\n";
- }
- Log.i("attribute", str);
- }
- typeArray.recycle();
- }
最後一定不要忘記typeArray.recycle():
- Give back a previously retrieved StyledAttributes, for later re-use.
反回以前提取的styledattributes,以後再使用。
在獲取屬性值的時候所用類似R.styleable.FlowIndicator_count的方式,其中FlowIndicator_count是採取的名字_屬性這種格式。定義好了自定義屬性,就可以在自定控件中的屬性設置了:
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res/com.dream.myqiyi"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <com.dream.myqiyi.widget.FlowIndicator
- android:id="@+id/myView"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="5dip"
- app:count="4"
- android:gravity="center"
- app:point_normal_color="#45000000"
- app:point_radius="3dip"
- app:point_seleted_color="#ffffff"
- app:point_size="5dip"
- app:space="10dip" />
- </FrameLayout>
然後我們就可以使用app:這樣設置自定義的屬性了。
如果控件繼承自某個View類,那麼在定義屬性的時候就不用考慮佈局的屬性的了;