ImageButton单击切换图片效果

转载请标明: http://blog.csdn.net/u012637501

我们平时在使用手机app时,常常会发现当我们按下某个按钮时相应按钮会发生变化,当我们松手时又恢复了原来的样子。或是,当你连续单击同一个按钮,会实现不同的功能。刚开始的时候感觉很神奇,那么现在我们来揭开她的面纱,经过下面的学习我相信你也可以轻轻松松将其拿下!

一、单击效果

首先看下将要实现的效果:

Android为实现图片按钮按下的效果有两种方式可以实现:一是增加代码,二配置XML。

1.方式一:增加代码实现

(1)main.xml布局文件:通过android:src属性设置初始背景图片

<ImageButton

android:id="@+id/speak"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/speak" />

(2)在ImageButtonTest.java中

为ImageButton注册一个事件监听器,然后根据事件动作为ImageButton更改不同的背景图片。

ImageButton btn=(ImageButton)findViewById(R.id.speak);

btn.setOnTouchListener(new OnTouchListener(){

@Override

public boolean onTouch(View v, MotionEvent event) {

if(event.getAction() == MotionEvent.ACTION_DOWN) //按下重新设置背景图片

{

((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.speaking));

}

else if(event.getAction() == MotionEvent.ACTION_UP) //松手恢复原来图片

{

((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.speak));

}

return false;

}

});

2.方式二:配置XML实现

Android中的按钮有三种状态—默认,被点击,被选中。所以,如果要改变按钮的外观,需要对这三种情况都做出修改,也许在以往,我们最容易想到的就是,手动监听按钮的选中和点击事件,然后写代码来替换按钮的背景,但是在android中,我们不需要这么麻烦,android早就替我们想好了解决方案,那就是selector资源。如果我们要实现按钮的三种背景,只需在res/drawable目录中建立这样一个XML文件:

(1)在/res/drawable目录下增加一个imagepress.xml文件,用于设置触发按钮时显示不同的图片效果

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:state_pressed="false" android:drawable="@drawable/speak"/>

<item android:state_focused="true" android:drawable="@drawable/speaking"/>

<item android:state_pressed="true" android:drawable="@drawable/speaking"/>

</selector>

注意:资源imagepress.xml文件可以存放到drawable目录,也可以存放到layout目录。

(2)在main.xml中配置ImageButton

<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" >

<ImageButton

android:id="@+id/speak"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/imagepress" />

</LinearLayout>

注意:当使用XML来实现该效果时,ImageButton配置无需使用android:src属性设置图片而是使用android:background属性指定我们设计好的imagepress.xml资源。

二、双击效果

所谓双击效果,即当第一次点击按钮与第二次点击按钮,不仅可以更换按钮的背景图片并且可以在一次按钮被按下后所实现的功能是不同的。下面,我们通过selector资源来说实现按钮背景效果更改。

1.第一次按下ImageButton图片资源/res/drawable/firstpress.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:state_window_focused="false" android:drawable="@drawable/speaking"/>

<item android:state_focused="false" android:drawable="@drawable/speaking"/>

<item android:state_pressed="true" android:drawable="@drawable/speaking"/>

</selector>

2.再次按下ImageButton图片资源/res/drawable/secondpress.xml(默认状态)

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:state_window_focused="false" android:drawable="@drawable/speak"/>

<item android:state_focused="false" android:drawable="@drawable/speak"/>

<item android:state_pressed="true" android:drawable="@drawable/speak"/>

</selector>

注意:

android:drawable 放一个drawable资源

android:state_pressed 是否按下,如一个按钮触摸或者点击。

android:state_focused 是否取得焦点,比如用户选择了一个文本框。

android:state_hovered 光标是否悬停,通常与focused state相同,它是4.0的新特性

android:state_selected 被选中,它与focus state并不完全一样,如一个list view 被选中的时候,它里面的各个子组件可能通过方向键,被选中了。

android:state_checkable 组件是否能被check。如:RadioButton是可以被check的。

android:state_checked 被checked了,如:一个RadioButton可以被check了。

android:state_enabled 能够接受触摸或者点击事件

android:state_activated 被激活(这个麻烦举个例子,不是特明白)

android:state_window_focused 应用程序是否在前台,当有通知栏被拉下来或者一个对话框弹出的时候应用程序就不在前台了

如果有多个item,那么程序将自动从上到下进行匹配,最先匹配的将得到应用。(不是通过最佳匹配)

3.在MainActivity.java中为定义的ImageButton注册一个事件监听器,并定义一个boolean类型标志用来判定上一次使用的是那种背景资源并完成用户自定义功能。

boolean pressPictureFlag=false;

final ImageButton btn=(ImageButton)findViewById(R.id.speak);

btn.setOnTouchListener(new OnTouchListener()/*按下与松手属于两个事件*/

{

@Override

public boolean onTouch(View v, MotionEvent event)

{

if(event.getAction() == MotionEvent.ACTION_DOWN)

{

if(pressPictureFlag==false)

{

btn.setBackgroundResource(R.drawable.pressd);

/*..................

功能代码1*/

pressPictureFlag=true;

}

else

{

btn.setBackgroundResource(R.drawable.imagepress);

/*..................

功能代码2*/

pressPictureFlag=false;

}

}

else if(event.getAction() == MotionEvent.ACTION_UP)

{

Toast.makeText(ImageButtonTetst.this, "操作成功!", Toast.LENGTH_SHORT).show();

}

return false;

}

});

注意:我们每次触碰一次ImageButton会产生两个事件,即按下事件和松手事件,而非只有一个事件。所以,在通过pressPictureFlag标识判定为btn组件设置哪个背景资源时,主要是在按下这个事件实现,松手这个事件也必须实现但是可以不做任何事情或者弹出一些通知信息即可。

4.源码举例

实现一个ImageButton,当单击btn按钮时,btn背景资源改变并文本编辑框可编辑(默认不可编辑);当再次单击btn按钮时,btn背景资源恢复原状此时文本编辑框不可编辑。

(1)/src/MainActivity.java

package com.example.android_ui_imagebutton;

import android.app.Activity;

import android.os.Bundle;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.EditText;

import android.widget.ImageButton;

import android.widget.Toast;

public class ImageButtonTetst extends Activity {

boolean pressPictureFlag=false;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

final ImageButton btn=(ImageButton)findViewById(R.id.speak);

final EditText edit = (EditText)findViewById(R.id.edit);

btn.setOnTouchListener(new OnTouchListener(){ /*按下与松手属于两个事件*/

@Override

public boolean onTouch(View v, MotionEvent event)

{

if(event.getAction() == MotionEvent.ACTION_DOWN)

{

if(pressPictureFlag==false)

{

btn.setBackgroundResource(R.drawable.pressd);

edit.setFocusable(true);

edit.setFocusableInTouchMode(true);

edit.requestFocus();

pressPictureFlag=true;

}

else

{

btn.setBackgroundResource(R.drawable.imagepress);

edit.setFocusable(false);

pressPictureFlag=false;

}

}

else if(event.getAction() == MotionEvent.ACTION_UP)

{

Toast.makeText(ImageButtonTetst.this, "操作成功!", Toast.LENGTH_SHORT).show();

}

return false;

}

});

}

}

(2)main.xml

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<EditText

android:id="@+id/edit"

android:layout_width="match_parent"

android:layout_height="100dp"

android:focusable="false" />

<ImageButton

android:id="@+id/speak"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/speak" />

</LinearLayout>

(3)/res/drawable/secondpress.xml、/res/drawable/firstpress.xml见1、2.

注意:如果main.xml布局文件中ImageButton使用android:src属性设置图片资源,那么在Java程序中使用setImageResource(sector资源)。如果使用android:background属性设置图片资源,那么在Java程序中使用setBackGround(sector资源)。

参考:http://blog.csdn.net/ztp800201/article/details/7312687

时间: 2024-10-28 10:40:02

ImageButton单击切换图片效果的相关文章

javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)

类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. 先贴上完成的效果. 实现原理不复杂,在动的一条一条的称之为“窗帘条”或者是“strip”,每一个strip都是一个div,类似于雪碧图的方式将其背景图的位置设置为strip的可视位置,然后用jquery的animate让他们按照一定规律动起来就完成窗帘切换效果了. 为了使用方便,将这个功能作为jq

javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调用和联动. 切换要求:当前图片显示指定时间后执行切换效果并切换下一张图片,最后一个切换后从头开始. 按照要求一个效果对象完成后要执行下一个,最后一个完成后要从头开始, 看上去就是一个带状态通知的环形列表,类似于这样的特征,可以采用职责链模式来构建. 职责链就是由不同的功能处理构成的链表,每一个功能处理作为一个

Android ImageButton单击切换按钮图片效果

正常状态的效果: 按钮按下的效果图片: 一.在java中为图片按钮增加触摸监听的函数来实现图片切换,代码如下: ImageButton btn = (ImageButton)findViewById(R.id.imageButton1); btn.setOnTouchListener(new View.OnTouchListener(){ public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == Mot

ImageButton单击切换按钮图片

有时单击ImageButton图片按钮时需要获取变换图片的效果,在这里介绍两种方法仅供参考 正常显示 点击切换 方法一:通过给按钮配置XML文件来实现图片按钮的背景切换效果 在layout或者是drawable文件下添加一个imagebtn_select.xml文件 <?xml version="1.0" encoding="utf-8"?>    <selector xmlns:android="http://schemas.andro

JS实现动态瀑布流及放大切换图片效果(js案例)

整理了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下. 该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击图片放大.上下切换效果.HTML布局写的很简单,图片加载主要是在JS中通过访问自定义的JSON字符串来实现.动态瀑布流的原理简单理解就是把新需要加载的图片放在上一排总高度最小的图片或模块下面,实现参差不齐的多栏布局效果.具体效果如下: 做这个案例我用了之前自己封装的框架,所以小伙伴需要到我的另一篇文

用CALayer实现淡入淡出的切换图片效果

由于直接更改layer的contents显示的隐式动画切换的时候的动画持续时间没办法控制, 切换效果不尽人意,所以这里配合了CABasicAnimation实现淡入淡出的切换效果, 另外还可以使用组合动画对多种动画进行组合, 实现更复杂的动画效果, 这里仅仅只是多添加了缩放效果为示例... 效果图: github:https://github.com/RinpeChen/changeImageWithAnimationByCALayer.git

鼠标单击切换图片

<style> body{background:#000000;text-align:center;} h1{margin:40px;color:#FFFFFF;font-weight:bold;} hr{color:#FFFFFF;margin:20px;} #Bos{width:500px;height:200px;margin:100px auto;}</style> <script> window.onload=function() { var curIndex

android 单击 切换图片 --- 注意图片大小

public class MixView extends ActionBarActivity { int []images = new int[] { R.drawable.pic1, R.drawable.pic2 }; int currImg = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layou

【转】Android android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)

首先我们还是看一些示例:(网易,新浪,百度)      下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个view怎么做,就要根据自己的喜爱了,实现有多种方法,下面我简单介绍一下. 第一种:ViewFlipper+GestureDetector 主布局就是一个listview,这里就不介绍了,我介绍下切换图片布局head_iamge.xml 1 <span style="font-size:12px;&