Android中的自定义属性的实现

Android开发中,如果系统提供的View组件不能满足我们的需求,我们就需要自定义自己的View,此时我们会想可不可以为自定义的View定义属性呢?答案是肯定的。我们可以定义自己的属性,然后像系统属性一样用在layout布局中。

通过下面3步既可以完成自定义属性:

第一步:在values文件夹下的attrs.xml文件(如果没有可以收到建立)中定义属性资源文件

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,值是整型。

第二步:在布局文件中使用自定义属性,并为其赋值

 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”。

第三步:在自定义的view中获取我们定义的属性值。

 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变化了。

 

 

你可能感兴趣的:(android)