前面已经介绍过自定义View组件的开发,自定义View组件与Android系统提供的View组件一样,即可在Java代码中使用,也可在XML界面布局代码中使用。

当在XML布局文件中使用Android系统提供的View组件时,开发者可以指定多个属性,这些熟悉可以很好地控制View组价的外观行为。如果用户开发的自定义View组件也需要指定属性,就需要属性资源的帮助了。

属性资源文件也放在/res/values目录下,属性资源的根元素也是<resources.../>,该元素里包含如下两个子元素。

  • attr子元素:定义一个属性。
  • declare-styleable子元素:定义一个styleable对象,每个styleable对象就是一组attr属性的集合。

当我们使用属性文件定义了属性之后,接下来就可以在自定义组价的构造器中通过AttributeSet对象获取这些属性了。

例如我们想开发一个默认带动画效果的图片,该图片显示时,自动从透明变成完全不透明,为此我们需要定义一个自定义组件,但这个自定义组件需要指定一个额外duration属性,该属性控制动画的持续时间。

为了在自定义组件中使用duration属性,需要先定义如下属性资源文件。

程序清单\res\values\attrs.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- 定义一个属性 -->
  4. <attr name="duration"  format="integer"></attr>
  5. <!-- 定义一个styleable对象来组合多个属性 -->
  6. <declare-styleable name="AlphaImageView">
  7. <attr name="duration"/>
  8. </declare-styleable>
  9. </resources>

上面的属性资源文件定义了该属性之后,至于到底在哪个View组件中使用该属性,该属性到底能发挥什么作用,就不归属性资源文件管了。属性资源所定义的属性到底可以发挥什么作用,取决于自定义组件的代码实现。

例如如下自定义的AlphaImageView,它获取了定义该组件所指定的duration属性之后,根据该属性来控制图片透明度的改变。程序代码如下。

提示:

在属性资源中定义<declare-styeable.../>元素时,也可在其内部直接使用<attr.../>定义属性,使用<attr.../>时指定一个format属性即可,例如上面我们可以指定<attr name="duration"  format="integer"/>

该程序的后台代码如下:

  1. package com.example.studyresources;
  2.  
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5.  
  6. import android.content.Context;
  7. import android.content.res.TypedArray;
  8. import android.graphics.Canvas;
  9. import android.os.Handler;
  10. import android.os.Message;
  11. import android.util.AttributeSet;
  12. import android.widget.ImageView;
  13.  
  14. public class AlphaImageView extends ImageView {
  15. //图像透明度每次改变的大小
  16. private int alphaDelta=0;
  17. //记录图片当前的透明度
  18. private int curAlpha=0;
  19. //每隔多少毫秒透明度改变一次
  20. private final int SPEED=300;
  21. Handler handler=new Handler()
  22. {
  23.  
  24. @Override
  25. public void handleMessage(Message msg) {
  26. // TODO Auto-generated method stub
  27. if(msg.what==0x123)
  28. {
  29. //每次增加curAlpha的值
  30. curAlpha+=alphaDelta;
  31. if(curAlpha>255)
  32. {
  33. curAlpha=255;
  34. }
  35. //修改该ImageView的透明度
  36. AlphaImageView.this.setAlpha(curAlpha);
  37. }
  38. }
  39.  
  40. };
  41. public AlphaImageView(Context context,AttributeSet attrs) {
  42. super(context,attrs);
  43. // TODO Auto-generated constructor stub
  44. TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.AlphaImageView);
  45. //获取duration参数
  46. int duration=typedArray.getInt(R.styleable.AlphaImageView_duration, 0);
  47. //计算图像透明度每次改变的大小
  48. alphaDelta=255*SPEED/duration;

  49. }
  50. @Override
  51. protected void onDraw(Canvas canvas) {
  52. // TODO Auto-generated method stub
  53. this.setAlpha(curAlpha);
  54. super.onDraw(canvas);
  55. final Timer timer=new Timer();
  56. //按固定间隔发送短信,通知系统改变图片的透明度
  57. timer.schedule(new TimerTask(){
  58.  
  59. @Override
  60. public void run() {
  61. // TODO Auto-generated method stub
  62. Message msg=new Message();
  63. msg.what=0x123;
  64. if(curAlpha>=255)
  65. {
  66. timer.cancel();
  67. }
  68. else
  69. {
  70. handler.sendMessage(msg);
  71. }
  72. }}, 0,SPEED);
  73. }
  74.  
  75. }

上面的程序中粗体字代码用于获取定义AlphaImageView时指定的duration属性,并根据该属性计算图片的透明度和变化幅度,接着程序重写了ImageView的onDraw(Canvas canvas)方法,该方法启动了一个任务调度来控制图片透明度的改变。

上面粗体字代码中的R.styeable.AlphaImageView、R.styeable.AlphaImageView_duration都是Android SDK根据属性资源文件自动生成的。

接着在界面布局文件使用AlphaImageView时可以为它指定一个duration属性,注意该属性位于"http://schemas.android.com/apk/res/+项目子包"命名空间下,例如本应用的包名为com.example.studyresources,那么duration属性就位于"http://schemas.android.com/apk/res/com.example.studyresources"命名空间下。

下面是该应用的界面布局文件的代码。

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:studyresources="http://schemas.android.com/apk/res/com.example.studyresources"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <!-- 定义自定义组件,并指定属性资源中定义的属性 -->
  8. <com.example.studyresources.AlphaImageView
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:src="@drawable/ee"
  12. studyresources:duration="60000"
  13. />
  14.  
  15. </LinearLayout>

上面的程序中第一行粗体字代码用于导入http://schemas.android.com/apk/res/com.example.studyresources命名空间,并指定该命名空间对应的短名前缀为studyresources;
   程序第二行粗体字代码用于为AlphaImageView组件指定自定义属性duration的属性值为60000。

主程序无须指定任何特殊的控制,只要简单地加载并显示上面的界面布局文件,运行该程序时即可看到该图片从无到有,慢慢显示出来的效果。

如下图:

属性(Attribute)资源的更多相关文章

  1. Android应用资源--之属性(Attribute)资源

    原文链接: http://wujiandong.iteye.com/blog/1184921 属性(Attribute)资源:属于整个Android应用资源的一部分.其实就是网上一堆介绍怎么给自定义V ...

  2. 转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨

    1.引子 转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数.属性获取问题. 2.转发和重定向 1).转发 转发是服务器行为,将当前请求(Request)和响应( ...

  3. C#属性(Attribute)用法实例解析

    属性(Attribute)是C#程序设计中非常重要的一个技术,应用范围广泛,用法灵活多变.本文就以实例形式分析了C#中属性的应用.具体入戏: 一.运用范围 程序集,模块,类型(类,结构,枚举,接口,委 ...

  4. opencart3属性attribute实现换行等简单html代码

    opencart3属性attribute在前台页面默认是没有解析html代码功能的,比如想实现换行,后台这样写:line 1<br>line 2,但前台产品页也是line 1<br& ...

  5. Servlet中的属性(attribute)和参数(parameter)的区别

    1.引子 初学者对属性(attribute)和参数(parameter)容易搞混.没搞清他们的区别,项目中就可能出现一此莫名其妙的问题. 2.两者的区别 1) 属性(attribute) 属性是在后台 ...

  6. C#教程之C#属性(Attribute)用法实例解析

    引用:https://www.xin3721.com/ArticlecSharp/c11686.html 属性(Attribute)是C#程序设计中非常重要的一个技术,应用范围广泛,用法灵活多变.本文 ...

  7. 属性 Attribute

    一.创建属性 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor, AllowMultiple = true, ...

  8. 【转】Struts1.x系列教程(3):属性(资源)文件乱码问题的解决之道

    转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/14/251244.html ...

  9. boolean attribute(布尔值属性) attribute vs property

    boolean attribute(布尔值属性) boolean attribute     HTML - Why boolean attributes do not have boolean val ...

  10. WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)

    如第一个示例所示,如果将 TargetType 属性设置为 TextBlock 而不为样式分配 x:Key,样式就会应用于所有 TextBlock 元素.这种情况下,x:Key 隐式设置为 {x:Ty ...

随机推荐

  1. std::string

    /************************************************************************* > File Name: string.cp ...

  2. HDU - 2680 最短路 spfa 模板

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意,就是一个人可以从多个起点开始出发,看到终点的最短路是多少..只有可以运用和hdu2066 ...

  3. 最后的配置部分:LNMP+Tomcat

    Nginx与PHP部分 mkdir /www/php -p echo -e "<?php\n\tphpinfo();\n?>" > /www/php/index. ...

  4. html ajax 双引号的问题

    "<a onClick='openwin_searchmodel()' href='searchmodel.action?projectname="+person[i].ge ...

  5. 转 Android HttpClient post MultipartEntity - Android 上传文件

    转自  http://blog.csdn.net/hellohaifei/article/details/9707089 在Android 中使用HttpClient,MultipartEntity ...

  6. The Willpower Instinct

    https://book.douban.com/subject/7043452/ 1.冥想2.健康饮食(低GI.素食为主,未加工食物为主).低GI食物使血糖稳定(蛋白.麦片.粗纤谷类.豆类.水果蔬菜) ...

  7. angularJS 系列(三)- 自定义 Service

    参考:http://viralpatel.net/blogs/angularjs-service-factory-tutorial/ https://www.pluralsight.com/blog/ ...

  8. eclipse java生成exe

    eclipse导出jar文件再将它转换成exe可执行文件详解 关键字: 欢迎光临 此文章是为了帮助刚接触j2se或不懂如何打包jar文件的人而着笔,同时也是让自己的知识以文章的形式保存起来. 一.导出 ...

  9. openstack controller ha测试环境搭建记录(十)——配置neutron(控制节点)

    创建neutron用户:mysql -u root -p CREATE DATABASE neutron;GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@ ...

  10. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...