Android開發中,若是系統提供的View組件不能知足咱們的需求,咱們就須要自定義本身的View,此時咱們會想可不能夠爲自定義的View定義屬性呢?答案是確定的。咱們能夠定義本身的屬性,而後像系統屬性同樣用在layout佈局中。android
經過下面3步既能夠完成自定義屬性:canvas
第一步:在values文件夾下的attrs.xml文件(若是沒有能夠收到創建)中定義屬性資源文件ide
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 4 <declare-styleable name="AlphaImageView"> 5 <attr name="myduration" format="integer"></attr> 6 </declare-styleable> 7 8 </resources>
其中declare-styleable標籤中定義的是自定義的屬性名和屬性值的格式,此處是myduration,值是整型。佈局
第二步:在佈局文件中使用自定義屬性,併爲其賦值spa
1 <RelativeLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:my="http://schemas.android.com/apk/res/com.example.attrrestest" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" > 10 11 <com.example.attrrestest.AlphaImageView 12 android:id="@+id/imageView1" 13 android:layout_width="fill_parent" 14 android:layout_height="fill_parent" 15 android:src="@drawable/abc_cab_background_top_holo_dark" 16 my:myduration="60000" /> 17 18 </RelativeLayout>
其中第11行是我自定義的一個View(代碼在下面),在這個view中(16行)用到了第一步定義的屬性myduration,併爲他賦值爲60000。須要注意的是系統屬性的前綴用的是「android:」,而自定義屬性的前綴是「my:」,這個前綴是在第3行須要咱們手動引入的:「xmlns:my="http://schemas.android.com/apk/res/com.example.attrrestest」,「http://schemas.android.com/apk/res/」部分是固定不變的,後面加上應用的包名,我這裏的包名是「com.example.attrrestest」。rest
第三步:在自定義的view中獲取咱們定義的屬性值。code
1 public class AlphaImageView extends ImageView { 2 int alphaDelta = 0;// 透明度每次改變的大小 3 int curAlpha = 0;// 當前透明度的大小 4 int speed = 300; // 300毫秒改變一次 5 6 Handler mHandler = new Handler() { 7 8 @Override 9 public void handleMessage(Message msg) { 10 if (msg.what == 0x123) { 11 12 curAlpha += alphaDelta; 13 if (curAlpha > 255) { 14 curAlpha = 255; 15 } 16 setAlpha(curAlpha); 17 } 18 } 19 }; 20 21 public AlphaImageView(Context context, AttributeSet attrs) { 22 super(context, attrs); 23 TypedArray typedArray = getResources().obtainAttributes(attrs, R.styleable.AlphaImageView);// 獲取自定義的屬性集 24 Integer duration = typedArray.getInteger(R.styleable.AlphaImageView_myduration, 1);// 從屬性集中獲取須要的屬性的值,該值由xml賦值 25 alphaDelta = 255 * speed / duration; 26 27 } 28 29 @Override 30 protected void onDraw(Canvas canvas) { 31 setAlpha(curAlpha);//開始爲透明,放在顯示以前執行 32 super.onDraw(canvas); 33 34 final Timer timer = new Timer(); 35 timer.schedule(new TimerTask() { 36 37 @Override 38 public void run() { 39 if (curAlpha <= 255) { 40 mHandler.sendEmptyMessage(0x123); 41 } else { 42 timer.cancel(); 43 } 44 45 } 46 }, 0, speed); 47 } 48 49 }
此處我定義了一個view名稱爲AlphaImageView 繼承於系統的ImageView,在代碼的23,24行是獲取第二步中咱們給自定義屬性賦的值,獲取到值後就能夠用來控制view變化了。orm