前言

本篇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. JS实现自定义排序

    定义:用本地特定的顺序来比较两个字符串. 语法:stringObject.localeCompare(target) 参数:target——要以本地特定的顺序与 stringObject 进行比较的字 ...

  2. Vue.js之组件系统

    vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. Vue.js组件系统 每一个新技 ...

  3. Android工程中javax annotation Nullable找不到的替代方案

    我们在某些Android开源库中会遇到下面的引用找不到的问题:import javax.annotation.Nonnull;import javax.annotation.Nullable; 其实A ...

  4. 【Zookeeper】Zookeeper集群单节点提供服务

    以下只在特殊情况下使用,不要用在生产环境. 一.问题背景 公司的产品使用Zookeeper做为集群支持,但是客户在验收的时候提出了一个很为难人的要求,那就是3台集群服务,停止2台以后,还要求我们的应用 ...

  5. react native中Unable to load script from assets 'index.android.bundle'解决方案

    刚刚朋友问我,说是创建好一个项目,运行后报错:Unable to load script from assets 'index.android.bundle',以前好好的没出现这种现象,于是我找到一个 ...

  6. 【Java入门提高篇】Day19 Java容器类详解(二)Map接口

    上一篇里介绍了容器家族里的大族长——Collection接口,今天来看看容器家族里的二族长——Map接口. Map也是容器家族的一个大分支,但里面的元素都是以键值对(key-value)的形式存放的, ...

  7. java基础知识文章汇总

    将之前的所有关于Java基础知识的随笔,整理成质量较高的十几篇随笔,几乎是好几篇比较零散的随笔合成现在的一篇,自认为还不错. java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规 ...

  8. 留言板0.3_models设计

    1.编写"message.models": class UserMessage(models.Model): name = models.CharField(max_length= ...

  9. 控制台中寄宿WCF服务

    一.首先创建一个类库,用来定义WCF服务 修改服务代码定义,具体代码如下 // 注意: 使用"重构"菜单上的"重命名"命令,可以同时更改代码和配置文件中的接口名 ...

  10. PHP检查当前数组为几维数组

    本文出至:新太潮流网络博客 /** * [TestArray 检测数组是一维还是二维] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB ...