前言

本篇Blog将记录关于Android应用资源中最经常使用的一个Drawable资源——StateListDrawable,本来说应当继续写UI方面的内容,突然跳到应用资源这边,主要是由于之前写界面的时候有一个小效果不知道怎样实现。Android自带的Button点击的时候会有一个效果,即Button按下的时候背景色会发生改变,而Button弹起的时候背景色又恢复到原来的样子。

这个效果看似非常easy。但着实不知道怎么做,由于实际应用的时候使用Button一般会改变背景,但仅仅给Button设置一个background是不行的,这样点击Button全然看不出点击效果。用户体验非常差。所以应当准备一个背景和一个点击的背景,让用户点击前后进行自己主动切换。假设是web页面的话那么这样的效果肯定是通过javascript的onmousedown和onmouseup这两个事件去实现,而Android呢?经过查找资料才发现是用过StateListDrawable这个对象实现的,以下通过和web的对照详细记录一下实现过程。

一、HTML+Javascript实现Button按下和弹起时切换图片

以下就模仿一个百度的button,一般web页面的button是通过鼠标点击的。所以当鼠标移到button上(悬浮)、当鼠标移除button(离开)、当鼠标左键按下(按键按下)、当鼠标左键松开(按键抬起)时都会有背景切换的效果。我们能够先看看百度button的效果图:

细致观察一下button的变化,不难发现一共同拥有3种背景,颜色由浅变深。从鼠标在button外部,到鼠标悬浮在button上,到按下鼠标左键点击button,然后从鼠标按键弹起,到鼠标悬浮在button上,再到鼠标离开button,颜色又由深变浅。

以下通过一个简单的HTML模拟一下上面的效果:

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style type="text/css">
#img1{
cursor: pointer;
}
</style> <script type="text/javascript">
var num = 0 ;
function fun1(){
document.getElementById("img1").src="2.jpg";
} function fun2(){
document.getElementById("img1").src="1.jpg";
} function fun3(event){
document.getElementById("img1").src="3.png";
} function fun4(){
document.getElementById("img1").src="2.jpg";
}
</script>
</head>
<body>
<img id="img1" src="1.jpg" onmousemove="fun1();" onmouseout="fun2();" onmousedown="fun3(event);" onmouseup="fun4();">
</body>
</html>

执行后的效果:

非常easy,是通过javascript的4个鼠标事件去完毕背景图的切换而已。

安卓手机上的Button因为没有移动悬浮这样的情况,所以仅仅存在按下和弹起的效果,并且这一切都已经封装好了,我们仅仅须要使用就能够了。以下就详细记录一下用法。

二、通过StateListDrawable设置button效果

StateListDrawable用于组织多个Drawable对象,当使用它作为目标组件的背景、背景图片时。StateListDrawable对象所显示的Drawable对象会随着目标组件状态的改变而自己主动切换。这也是我们所须要的。

定义StateListDrawable对象的XML文件的根元素为<selector.../>,该元素能够包括多个<Item.../>元素。item元素能够指定下面属性:

android:color或android:drawable 指定颜色或Drawable对象

android:state_?

??

指定一个特定状态,类似于javascript的事件。比方:按下、弹起、悬浮等等。

以下通过一个表格看看这个state详细支持了哪些状态:

了解了各“事件”以及含义,如今在安卓中实现上面的效果应该so easy了吧!以下看看完整的样例。

res/drawable/ibtn_baidu_search.xml:



<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ibtn_baidu_pic_2" android:state_pressed="true"></item>
<item android:drawable="@drawable/ibtn_baidu_pic_1"></item> </selector>



activity_main.xml:



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context="com.example.fragmentdemo.MainActivity" > <Button
android:layout_width="200dp"
android:layout_height="50dp"
android:background="@drawable/ibtn_baidu_search"
android:text="百度一下"
android:textColor="#FFFFFF" /> </LinearLayout>

执行效果例如以下:

三、总结

本篇blog记录了android应用资源中StateListDrawable的简单用法。也没有什么技术点和难点。仅算是自己安卓学习路上的点滴积累吧,处女座的完美主义精神让我发现了这个需求,从而寻找方法,终于解决,我也明确了技术方面不能打马虎,有问题就要及时寻找解决方法,这样日积月累终有一天我相信我能成为一名合格的Android
Develope !!!

处女男学Android(七)---Android 应用资源之StateListDrawable的更多相关文章

  1. android学习笔记32——资源

    Android应用资源 资源分类: 1.无法直接访问的原生资源,保存于asset目录下 2.可通过R资源清单类访问的资源,保存于res目录下 资源的类型以及存储方式 android要求在res目录下用 ...

  2. Android中的Drawable资源

    在Android应用中,常常会用到Drawable资源,比如图片资源等,在Android开发中我们是用Drawable类来Drawable类型资源的. Drawable资源一般存储在应用程序目录的\r ...

  3. android基础5——使用资源

    Android会基于当前的硬件.设备和语言配置来为某个资源标识符选择最合适的值. 1.在代码中使用资源 使用静态类R来访问资源.R类是基于外部资源而生的类,并且是在项目编译的时候创建的.R的每一个子类 ...

  4. (Android UI)Android应用程序中资源:图片、字符串、颜色、布局等

    Android系统设计采用代码和布局分离的设计模式,因此在设计Android应用程序时需要遵循该设计模式. “把非代码资源(如图片和字符串常量)和代码分离开来始终是一种很好的做法.”---<An ...

  5. android 中的一些资源注解,让编译器帮你检查代码

    android 中的一些资源注解,让编译器帮你检查代码 写方便的时候可以用注解来声明一些参数,以明确的指示参数的类型,让代码更安全.我们看到,在android源代码里大量使用了注解.我整理了一些注解如 ...

  6. Android最全开发资源(申明:来源于网络)

    Android最全开发资源(申明:来源于网络) 地址:http://www.jianshu.com/p/0c36302e0ed0?ref=myread

  7. Android开发---如何操作资源目录中的资源文件4 ---访问xml的配置资源文件的内容

    Android开发---如何操作资源目录中的资源文件4 XML,位于res/xml/,这些静态的XML文件用于保存程序的数据和结构. XmlPullParser可以用于解释xml文件 效果图: 描述: ...

  8. Android开发---如何操作资源目录中的资源文件3--圆角边框、背景颜色渐变效果、边框颜色

    Android开发---如何操作资源目录中的资源文件3 效果图 1.圆角边框 2.背景颜色渐变效果 1.activity_main.xml 描述: 定义了一个shape资源管理按钮 <?xml ...

  9. Android开发 ---如何操作资源目录中的资源文件2

    Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...

随机推荐

  1. Ubuntu16.10上安装NodeJS6.9.2

    1.下载 https://nodejs.org/en/download/ 2.解压 tar -xJf node-v6.9.2-linux-x64.tar.xz 3. 移到通用的软件安装目录 /opt/ ...

  2. SublimeText3常用插件及快捷键总结

    SublimeText可谓是前端工程师的代码编辑神器,自从用上它以后一直爱不释手,特别是它强大的插件功能,简直要逆天了.网上也有很多关于SublimeText3的各种插件介绍,其插件功能之多,让人眼花 ...

  3. oracle 定义临时变量,并使用分支判断

    declare tempCount int; tempID ); begin select count(*) into tempCount from CUSTOMER_PROFILE where id ...

  4. 【SPL标准库专题(9)】 Datastructures:SplObjectStorage

    PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...

  5. jboss eap6.1(5)(ejb升级)

    以前的项目是基于ejb2.x做的,ejb的配置文件为ejb-jar.xml和jboss.xml,现在把这个项目移到新版本服务器中的时候,报解析ejb-jar错误. 查阅许多资料才找到解决办法,原来jb ...

  6. touch创建文件

    创建文件 在cs目录下创建1.txt和2.txt文件 touch ./文件名.txt 或者 touch /root/cs 文件名.txt 或者 echo > ./文件名.txt 或者 >. ...

  7. Linux centos6.5 系统语言改成中文简体

    有时候上传的文件在linux上ls显示的时乱码,原因可能是系统语言编码问题,以Linux centos6.5为例,解决方法如下: 1.在root(皇帝)权限下更改: 查看当前所有语言环境:locale ...

  8. 彻底理解lib和dll

    转自:http://www.cppblog.com/amazon/archive/2009/09/04/95318.html 两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口 ...

  9. C# 利用VS自带的WSDL工具生成WebService服务类(转载)

    WebService有两种使用方式,一种是直接通过添加服务引用,另一种则是通过WSDL生成. 添加服务引用大家基本都用过,这里就不讲解了. 那么,既然有直接引用的方式,为什么还要通过WSDL生成呢? ...

  10. tcp尽快尽快了

    看的撒积分卡拉斯的放假啊的顺口溜