Android中的自定义属性的实现
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中的自定义属性的实现的更多相关文章
- Android 深入理解Android中的自定义属性
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45022631: 本文出自:[张鸿洋的博客] 1.引言 对于自定义属性,大家肯定 ...
- Android中attr自定义属性详解
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:wen=http ...
- Android中自定义属性(attrs.xml,TypedArray的使用)
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
- Android中XML的命名空间、自定义属性
命名空间(namespace) XML 命名空间提供避免元素命名冲突的方法. 举个例子,A学校有名学生叫做林小明,B学校也有名学生叫林小明,那我们如何识别这两名拥有相同名字的同学呢?这时候命名空间就派 ...
- Android中自定义样式与View的构造函数中的第三个参数defStyle的意义
零.序 一.自定义Style 二.在XML中为属性声明属性值 1. 在layout中定义属性 2. 设置Style 3. 通过Theme指定 三.在运行时获取属性值 1. View的第三个构造函数的第 ...
- Android自定义控件之自定义属性
前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性.本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解.有关原理知识请参考Android自定义控 ...
- Android 手机卫士--自定义属性
在前面的文章中,已经实现了“设置中心”第一栏的功能以及布局 本文地址:http://www.cnblogs.com/wuyudong/p/5936016.html,转载请注明出处. 自定义属性声明 接 ...
- Android中项目中各个文件夹的含义和用途详解
1.src:存放所有的*.java源程序. 2.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3.assets:可以存放项目一些较大的资源文件,例如:图片. ...
- Android之创建自定义属性
一. 在res/values 文件下定义一个attrs.xml 文件.代码如下: <?xml version="1.0" encoding="utf-8" ...
随机推荐
- AJAX中文乱码PHP完美解决(IE和Firefox兼容)
最近在做一个项目,遇到AJAX中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助. 众所周知,使用AJAX传送和接收中文参数时,如果不在客 ...
- 如何解决Python脚本在Linux和Windows上的格式问题
python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...
- 解决linux redhat6下安装git的问题
今天用到linux上的git安装过程比较曲折,记录一下: 首先会报需要perl rpm -ivh git-1.7.1-14.2.x86_64.rpm warning: git-1.7.1-14.2.x ...
- WPF WebBrowser
XAML <Window x:Class="WpfApplication5.Window1" xmlns="http://schemas.microso ...
- Android软键盘调用及隐藏,以及获得点击软键盘输入的字母信息
在Android提供的EditText中单击的时候,会自动的弹出软键盘,其实对于软键盘的控制我们可以通过InputMethodManager这个类来实现.我们需要控制软键盘的方式就是两种一个是像Edi ...
- HashMap早知道
第一眼hashmap始终Collection那个地点 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGxmMTIzMzIx/font/5a6L5L2T/f ...
- 【VBA研究】变量定义的类型和实际赋值类型
作者:iamlaosong VBA中变量能够先定义后使用,也能够不定义直接使用.假设模块前面加了Option Explicit语句,则变量必须先定义后使用. 只是.实验发现.VBA对变量类型没有进行严 ...
- nginx-systemtap-toolkit
https://github.com/openresty/nginx-systemtap-toolkit
- Linux运维工程师成长必经之路
本路线图是从0基础开始,全方位由浅入深,按照多年Linux培训经验和优秀教学方法制定的学习思路和学习方法,路线图包括初级入门.中级进阶.高级提升和资深冲刺四个阶段,每阶段对应着不同优秀的课程和学习方法 ...
- [转]VS2010 (C#)winform程序打包发布图解
1.新建一个Windows窗体应用程序,例如项目名为monitor,功能略.新建的时候不要忘了创建解决方案. 2.在monitor解决方案上“右击”—— “添加”——“新建项目”,选择“其他类型项目” ...