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

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

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

 <?xml version="1.0" encoding="utf-8"?>
<resources> <declare-styleable name="AlphaImageView">
<attr name="myduration" format="integer"></attr>
</declare-styleable> </resources>

其中declare-styleable标签中定义的是自定义的属性名和属性值的格式,此处是myduration,值是整型。

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

 <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:my="http://schemas.android.com/apk/res/com.example.attrrestest"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" > <com.example.attrrestest.AlphaImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/abc_cab_background_top_holo_dark"
my:myduration="60000" /> </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中获取我们定义的属性值。

 public class AlphaImageView extends ImageView {
int alphaDelta = 0;// 透明度每次改变的大小
int curAlpha = 0;// 当前透明度的大小
int speed = 300; // 300毫秒改变一次 Handler mHandler = new Handler() { @Override
public void handleMessage(Message msg) {
if (msg.what == 0x123) { curAlpha += alphaDelta;
if (curAlpha > 255) {
curAlpha = 255;
}
setAlpha(curAlpha);
}
}
}; public AlphaImageView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = getResources().obtainAttributes(attrs, R.styleable.AlphaImageView);// 获取自定义的属性集
Integer duration = typedArray.getInteger(R.styleable.AlphaImageView_myduration, 1);// 从属性集中获取需要的属性的值,该值由xml赋值
alphaDelta = 255 * speed / duration; } @Override
protected void onDraw(Canvas canvas) {
setAlpha(curAlpha);//开始为透明,放在显示之前执行
super.onDraw(canvas); final Timer timer = new Timer();
timer.schedule(new TimerTask() { @Override
public void run() {
if (curAlpha <= 255) {
mHandler.sendEmptyMessage(0x123);
} else {
timer.cancel();
} }
}, 0, speed);
} }

此处我定义了一个view名称为AlphaImageView 继承于系统的ImageView,在代码的23,24行是获取第二步中我们给自定义属性赋的值,获取到值后就可以用来控制view变化了。

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

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

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45022631: 本文出自:[张鸿洋的博客] 1.引言 对于自定义属性,大家肯定 ...

  2. Android中attr自定义属性详解

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:wen=http ...

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

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  4. Android中XML的命名空间、自定义属性

    命名空间(namespace) XML 命名空间提供避免元素命名冲突的方法. 举个例子,A学校有名学生叫做林小明,B学校也有名学生叫林小明,那我们如何识别这两名拥有相同名字的同学呢?这时候命名空间就派 ...

  5. Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

    零.序 一.自定义Style 二.在XML中为属性声明属性值 1. 在layout中定义属性 2. 设置Style 3. 通过Theme指定 三.在运行时获取属性值 1. View的第三个构造函数的第 ...

  6. Android自定义控件之自定义属性

    前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性.本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解.有关原理知识请参考Android自定义控 ...

  7. Android 手机卫士--自定义属性

    在前面的文章中,已经实现了“设置中心”第一栏的功能以及布局 本文地址:http://www.cnblogs.com/wuyudong/p/5936016.html,转载请注明出处. 自定义属性声明 接 ...

  8. Android中项目中各个文件夹的含义和用途详解

    1.src:存放所有的*.java源程序. 2.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3.assets:可以存放项目一些较大的资源文件,例如:图片. ...

  9. Android之创建自定义属性

    一. 在res/values 文件下定义一个attrs.xml 文件.代码如下: <?xml version="1.0" encoding="utf-8" ...

随机推荐

  1. HW3.20

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. 解读(GoogLeNet)Going deeper with convolutions

    (GoogLeNet)Going deeper with convolutions Inception结构 目前最直接提升DNN效果的方法是increasing their size,这里的size包 ...

  3. proftpd的示例配置文件

    # This is a basic ProFTPD configuration file (rename it to # 'proftpd.conf' for actual use. It estab ...

  4. openstack 虚拟机流量

  5. 记一次 Google 面试经历

    本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 这是我上周去面试的地方.很顺利,我觉得——至少我认为我已经尽我所能,并且无论发生什么事情对我都是有帮助的. 由于 ...

  6. IE-一根网线二台电脑上网

    1 直连线 使用交叉线(橙白 橙 (蓝白) (绿 绿白) ( 蓝)宗白 棕) 2 如果主机原本是用ADSL拔号上网的话,就在主机的网络连接下的宽带连接右击属性>高级,在“Internet 连接共 ...

  7. A Tour of Go Arrays

    The type [n]T is an array of n values of type T. The expression var a [10]int declares a variable a  ...

  8. 学习并使用了两种linq to entity 的实现sql关键字in的查询方法

    //构造Lambda语句        private static Expression<Func<TElement, bool>> BuildWhereInExpressi ...

  9. Java比较运算符

    注意哦: 1.  > . < . >= . <= 只支持左右两边操作数是数值类型 2.  == . != 两边的操作数既可以是数值类型,也可以是引用类型 public clas ...

  10. linux命令行模式下实现代理上网

    有些公司的局域网环境,例如我们公司的只允许使用代理上网,图形界面的很好解决就设置一下浏览器的代理就好了,但是linux纯命令行的界面就....下面简单几步就可以实现了! 一.命令行界面的一般代理设置方 ...