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

时间: 2024-10-13 07:47:30

Android中的自定义属性的实现的相关文章

Android 深入理解Android中的自定义属性

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45022631: 本文出自:[张鸿洋的博客] 1.引言 对于自定义属性,大家肯定都不陌生,遵循以下几步,就可以实现: 自定义一个CustomView(extends View )类 编写values/attrs.xml,在其中编写styleable和item等标签元素 在布局文件中CustomView使用自定义的属性(注意namespace) 在CustomView的构造方法中

Android高手之路之Android中的自定义属性attr.xml、TypedArray的使用

一般我们都是使用android:xxx=""...这样的android的属性.但有时我们需要使用自定义的属性,尤其是自定义view的时候尤其需要. 一般需要以下几个步骤: 1.在res/values 文件下定义一个attrs.xml 文件: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView&q

带你深入理解Android中的自定义属性!!!

引言 对于自定义属性,大家肯定都不陌生,遵循以下几步,就可以实现: 1.自定义一个CustomView(extends View )类 2.编写values/attrs.xml,在其中编写styleable和item等标签元素 3.在布局文件中CustomView使用自定义的属性(注意namespace) 4.在CustomView的构造方法中通过TypedArray获取 ps:如果你对上述几个步骤不熟悉,建议先熟悉下,再继续~ 那么,我有几个问题: 以上步骤是如何奏效的? styleable

Android中attr自定义属性详解

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:wen=http://schemas.android.com/apk/res/com.iteye.googlers android:orientation="vertical" android:layout_width="fill_parent" android:layout_heig

Android中自定义属性(attrs.xml,TypedArray的使用)

做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方提供的那些组件一样用xml来定义他的属性呢?现在我们就来讨论一下他的用法.1.添加文件attrs.xml,位于res\values目录下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <resources>

Android中自定义属性基本步骤

Android中自定义属性基本步骤 这次只是说明最简单的自定义属性流程 1. 创建资源文件: resources/attr.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="test"> <attr name="test" format="string" /

如何在android style文件中使用自定义属性

前几天我在项目中遇到了这样一个问题:我为项目编写了一个自定义控件,这个控件会被大量复用,所以我准备在style.xml文件中定义一个style来减少重复xml布局内容的编写,但是里面有一个自定义的控件属性,问题出现在这里,虽然自定义属性在layout布局xml中可以使用正常,但是却无法在style中定义,本来这个控件是大量服用的,style也是为了复用减少xml内容写的,我可以把自定义属性内容直接写死在自定义控件中,但是考虑到项目未来可能出现的变数,我还是准备将这个自定义属性写到style中,这

自定义组合控件和在自定义控件中使用自定义属性

今天,整理了一下我平时的笔记,写一个比较简单的自定义组合控件,仅供小白参考,大神请绕道,希望能够对大家有一些帮助 首先,得明白为什么我们需要自定义组合控件,它是因为原有控件并不能满足开发的需求,或者说并不能达到我们想要的一种效果,这个时候,就需要我们自己定义一些控件,以达到目的 ![先来看一下效果](http://img.blog.csdn.net/20160716224219109) 个人总结自定义控件的步骤: 1.先写一个布局,这里我用的是一个相对布局,我这里的相对布局就是根布局了 <?xm

Android中View自定义XML属性详解以及R.attr与R.styleable的区别

为View添加自定义XML属性 Android中的各种Widget都提供了很多XML属性,我们可以利用这些XML属性在layout文件中为Widget的属性赋值. 如下所示: <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> 我们可以通过TextView所提供