Android ImageButton的使用 及长按Button的实现
2013-05-21 01:09
246 查看
我自己用Photoshop画了2种按钮图片,每种有3种状态,分为:normal、focus、press等。
放在工程的“res/drawable/”目录下。
ImageButton要使用这些图片做出漂亮的效果,可以在Java代码中使用setImageResource(int)方法,我采用xml文件中设置android:src属性。
在工程目录“res/drawable/”下新建“imgbt1.xml”,文件内容为:
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/bt1_press" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/bt1_focus" /> <!-- focused -->
<item android:drawable="@drawable/bt1_normal" /> <!-- default -->
</selector>
新建“imgbt2.xml”,文件内容为:
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/bt2_press" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/bt2_focus" /> <!-- focused -->
<item android:drawable="@drawable/bt2_normal" /> <!-- default -->
</selector>
使用方法:
[html] view
plaincopy
<ImageButton
android:id="@+id/imgbt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#a000ff00"
android:src="@drawable/imgbt1"
/>
android:background="#a000ff00" 可设置Button或者ImageButton的背景为透明
表达式顺序是“aabbggrr”,其中“aa=alpha”(00-ff)、“bb=blue”(00-ff)、“gg=green”(00-ff)、“rr=red”(00-ff)。值以十六进制表示,对于alpha值,0表示完全透明,255表示完全不透明。
看文档,可在Java代码中使用方法onSetAlpha (int alpha)来设置透明度。
Button长按事件的实现
我在网上查看资料的时候,看到一篇游戏开发的长按Button实现,关键代码有给出,但都是抄来抄去,且并不完全,决定实现它。
增加个接口,用来实现监听事件。
[java] view
plaincopy
public interface RepeatListener
{
/** manpeng
* @param v 用户传入的Button对象
* @param duration 延迟的毫秒数
* @param repeatcount 重复次数回调
*/
void onRepeat(View v, long duration, int repeatcount);
}
既然要实现ImageButton类的长按事件,首先自定义RepeatButton类,当然这个类要继承ImageButton。
需要增加RepeatButton类的成员变量mInterval,用来记录长按的时间,也就是说press这个按钮的时候,多久时间算一次长按。
例:mInterval=5000;//mInterval设为5秒钟,假设用户长按Button了12秒,那么用户长按了该按钮2次。
当长按时,会执行performLongClick(),我们override该方法,并启动一个线程。
这是一个Runnable线程mThread,在线程实现中,每隔mInterval时间,判断按键是否还在按下,以及回调监听事件,是实现长按Button的关键。
postDelayed(this, mInterval);//这句实现了长按事件中,线程mThread不断的循环判断
当用户结束长按的时候,根据触摸或按键的不同,此时可能触发onTouchEvent或触发onKeyDown函数,我们override这2个函数后,在其中要停止线程。
因为是延迟一定的时间,才执行线程,所以在结束长按的时候要把没有执行的线程drop掉:
removeCallbacks(mThread);//删除队列当中未执行的线程对象,否则线程可能还会再执行一次。
下面给出RepeatButton类的代码:
[java] view
plaincopy
/*
* Copyright (C) 2012 Manpeng
*
* http://blog.csdn.net/manp1212
*
*/
package com.manpeng.example;
import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.ImageButton;
/**
* @author manpeng
*/
public class RepeatButton extends ImageButton
{
public static final String TAG = "RepeatButton";
private long mStart;//长按开始时间
private int mRepeatCount;//长按重复次数
private RepeatListener mListener;//
private long mInterval = 500;//长按一次持续时间
public RepeatButton(Context context)
{
super(context);
Log.d(TAG, "RepeatButton1");
}
public RepeatButton(Context context, AttributeSet attrs)
{
super(context, attrs);
Log.d(TAG, "RepeatButton");
setFocusable(true); //设置焦点
setLongClickable(true); //启用长按事件,长按后会执行performLongClick()
}
public RepeatButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
Log.d(TAG, "RepeatButton3");
}
private Runnable mThread = new Runnable()
{
public void run()
{
Log.d(TAG, "mRepeaterThread run()");
doRepeat(false);
if (isPressed())
{
Log.d(TAG, "mRepeaterThread run() press");
postDelayed(this, mInterval);//延迟mInterval后执行当前线程
}
}
};
/**
* @param end 表示最后一次长按,即结束长按事件
*/
private void doRepeat(boolean end)
{
Log.d(TAG, "mRepeaterThread run() end=" + end);
long now = SystemClock.elapsedRealtime();//获取当前时间
if (mListener != null)
{
mListener.onRepeat(this, now - mStart, end ? -1 : mRepeatCount++);
}
}
/**
* 长按结束
*/
private void endRepeat()
{
doRepeat(true);
mStart = 0;
}
/**
* 设置长按监听事件,初始化mInterval
*/
public void setRepeatListener(RepeatListener listener, long interval)
{
Log.d(TAG, "setRepeatListener interval=" + interval);
mListener = listener;
mInterval = interval;
}
@Override
public boolean performLongClick()
{
Log.d(TAG, "performLongClick");
mStart = SystemClock.elapsedRealtime();//获取系统当前时间
mRepeatCount = 0;
post(mThread);//调用post()方法,执行mThread
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_UP)
{
Log.d(TAG, "onTouchEvent UP");
removeCallbacks(mThread);//删除队列当中未执行的线程对象
if (mStart != 0)
{
endRepeat();
}
}
return super.onTouchEvent(event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
//Log.d(TAG, "onKeyDown keyCode=" + keyCode);
switch(keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
super.onKeyDown(keyCode, event);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
Log.d(TAG, "onKeyUp keyCode=" + keyCode);
switch(keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
removeCallbacks(mThread);
if (mStart != 0)
{
Log.d(TAG, "onKeyUp mStart=" + mStart);
endRepeat();
}
super.onKeyUp(keyCode, event);
return true;
}
return super.onKeyUp(keyCode, event);
}
}
在布局xml文件中,添加RepeatButton,需要以下定义。
[html] view
plaincopy
<com.manpeng.example.RepeatButton
android:id="@+id/rptbt3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#80000000"
android:src="@drawable/imgbt2"
/>
注意:RepeatButton是我们自定义的类,所以引用的时候,要加上全名。
在Activity中,要使用的话,先要实现RepeatListener:
[java] view
plaincopy
public class MyRepeatListener implements RepeatListener
{
public void onRepeat(View v, long duration, int repeatcount)
{
//加入处理代码
}
}
然后设置setRepeatListener,实现监听:
[java] view
plaincopy
RepeatButton rb = (RepeatButton)findViewById(R.id.rptbt3);
rb.setRepeatListener(new MyRepeatListener(), 5000);
下面给出源码的下载地址:http://download.csdn.net/detail/manp1212/4400624
放在工程的“res/drawable/”目录下。
ImageButton要使用这些图片做出漂亮的效果,可以在Java代码中使用setImageResource(int)方法,我采用xml文件中设置android:src属性。
在工程目录“res/drawable/”下新建“imgbt1.xml”,文件内容为:
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/bt1_press" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/bt1_focus" /> <!-- focused -->
<item android:drawable="@drawable/bt1_normal" /> <!-- default -->
</selector>
新建“imgbt2.xml”,文件内容为:
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/bt2_press" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/bt2_focus" /> <!-- focused -->
<item android:drawable="@drawable/bt2_normal" /> <!-- default -->
</selector>
使用方法:
[html] view
plaincopy
<ImageButton
android:id="@+id/imgbt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#a000ff00"
android:src="@drawable/imgbt1"
/>
android:background="#a000ff00" 可设置Button或者ImageButton的背景为透明
表达式顺序是“aabbggrr”,其中“aa=alpha”(00-ff)、“bb=blue”(00-ff)、“gg=green”(00-ff)、“rr=red”(00-ff)。值以十六进制表示,对于alpha值,0表示完全透明,255表示完全不透明。
看文档,可在Java代码中使用方法onSetAlpha (int alpha)来设置透明度。
Button长按事件的实现
我在网上查看资料的时候,看到一篇游戏开发的长按Button实现,关键代码有给出,但都是抄来抄去,且并不完全,决定实现它。
增加个接口,用来实现监听事件。
[java] view
plaincopy
public interface RepeatListener
{
/** manpeng
* @param v 用户传入的Button对象
* @param duration 延迟的毫秒数
* @param repeatcount 重复次数回调
*/
void onRepeat(View v, long duration, int repeatcount);
}
既然要实现ImageButton类的长按事件,首先自定义RepeatButton类,当然这个类要继承ImageButton。
需要增加RepeatButton类的成员变量mInterval,用来记录长按的时间,也就是说press这个按钮的时候,多久时间算一次长按。
例:mInterval=5000;//mInterval设为5秒钟,假设用户长按Button了12秒,那么用户长按了该按钮2次。
当长按时,会执行performLongClick(),我们override该方法,并启动一个线程。
这是一个Runnable线程mThread,在线程实现中,每隔mInterval时间,判断按键是否还在按下,以及回调监听事件,是实现长按Button的关键。
postDelayed(this, mInterval);//这句实现了长按事件中,线程mThread不断的循环判断
当用户结束长按的时候,根据触摸或按键的不同,此时可能触发onTouchEvent或触发onKeyDown函数,我们override这2个函数后,在其中要停止线程。
因为是延迟一定的时间,才执行线程,所以在结束长按的时候要把没有执行的线程drop掉:
removeCallbacks(mThread);//删除队列当中未执行的线程对象,否则线程可能还会再执行一次。
下面给出RepeatButton类的代码:
[java] view
plaincopy
/*
* Copyright (C) 2012 Manpeng
*
* http://blog.csdn.net/manp1212
*
*/
package com.manpeng.example;
import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.ImageButton;
/**
* @author manpeng
*/
public class RepeatButton extends ImageButton
{
public static final String TAG = "RepeatButton";
private long mStart;//长按开始时间
private int mRepeatCount;//长按重复次数
private RepeatListener mListener;//
private long mInterval = 500;//长按一次持续时间
public RepeatButton(Context context)
{
super(context);
Log.d(TAG, "RepeatButton1");
}
public RepeatButton(Context context, AttributeSet attrs)
{
super(context, attrs);
Log.d(TAG, "RepeatButton");
setFocusable(true); //设置焦点
setLongClickable(true); //启用长按事件,长按后会执行performLongClick()
}
public RepeatButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
Log.d(TAG, "RepeatButton3");
}
private Runnable mThread = new Runnable()
{
public void run()
{
Log.d(TAG, "mRepeaterThread run()");
doRepeat(false);
if (isPressed())
{
Log.d(TAG, "mRepeaterThread run() press");
postDelayed(this, mInterval);//延迟mInterval后执行当前线程
}
}
};
/**
* @param end 表示最后一次长按,即结束长按事件
*/
private void doRepeat(boolean end)
{
Log.d(TAG, "mRepeaterThread run() end=" + end);
long now = SystemClock.elapsedRealtime();//获取当前时间
if (mListener != null)
{
mListener.onRepeat(this, now - mStart, end ? -1 : mRepeatCount++);
}
}
/**
* 长按结束
*/
private void endRepeat()
{
doRepeat(true);
mStart = 0;
}
/**
* 设置长按监听事件,初始化mInterval
*/
public void setRepeatListener(RepeatListener listener, long interval)
{
Log.d(TAG, "setRepeatListener interval=" + interval);
mListener = listener;
mInterval = interval;
}
@Override
public boolean performLongClick()
{
Log.d(TAG, "performLongClick");
mStart = SystemClock.elapsedRealtime();//获取系统当前时间
mRepeatCount = 0;
post(mThread);//调用post()方法,执行mThread
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_UP)
{
Log.d(TAG, "onTouchEvent UP");
removeCallbacks(mThread);//删除队列当中未执行的线程对象
if (mStart != 0)
{
endRepeat();
}
}
return super.onTouchEvent(event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
//Log.d(TAG, "onKeyDown keyCode=" + keyCode);
switch(keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
super.onKeyDown(keyCode, event);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
Log.d(TAG, "onKeyUp keyCode=" + keyCode);
switch(keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
removeCallbacks(mThread);
if (mStart != 0)
{
Log.d(TAG, "onKeyUp mStart=" + mStart);
endRepeat();
}
super.onKeyUp(keyCode, event);
return true;
}
return super.onKeyUp(keyCode, event);
}
}
在布局xml文件中,添加RepeatButton,需要以下定义。
[html] view
plaincopy
<com.manpeng.example.RepeatButton
android:id="@+id/rptbt3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#80000000"
android:src="@drawable/imgbt2"
/>
注意:RepeatButton是我们自定义的类,所以引用的时候,要加上全名。
在Activity中,要使用的话,先要实现RepeatListener:
[java] view
plaincopy
public class MyRepeatListener implements RepeatListener
{
public void onRepeat(View v, long duration, int repeatcount)
{
//加入处理代码
}
}
然后设置setRepeatListener,实现监听:
[java] view
plaincopy
RepeatButton rb = (RepeatButton)findViewById(R.id.rptbt3);
rb.setRepeatListener(new MyRepeatListener(), 5000);
下面给出源码的下载地址:http://download.csdn.net/detail/manp1212/4400624
相关文章推荐
- Android开关按钮ToggleButton的使用,可以实现密码框和文本框的切换
- android 用户界面笔记之Button和ImageButton实现按钮响应事件两种方法
- Android商城开发系列(三)——使用Fragment+RadioButton实现商城底部导航栏
- Android中使用CountDownTimer实现Button上倒计时
- Android使用xml定义带背景Button(解决ImageButton不能加文字的问题)
- android selector 背景选择器的使用, button (未点击,点击,选中保持状态)效果实现
- [Android] ImageButton | Button | TextView 点击和触摸效果实现
- android selector 背景选择器的使用, button (未点击,点击,选中保持状态)效果实现
- Android 使用线性布局LinearLayout和Button实现一个点红块游戏
- Android 自定义标签 Imagebutton实现ImageButton里放置文字
- Android 自定义标签 Imagebutton实现ImageButton里放置文字
- Android手机开发 使用线性布局和相对布局实现Button垂直水平居中
- Android GridView 的item 使用 Button,imagebutton 等ui控件后,不能响应OnItemClick()事件
- Android使用NinePatch图片实现大小可变的Button
- 使用Broadcast实现android组件之间的通信
- Android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态
- android studio spinner button textview共同使用的小app
- android通过webservice进行网络编程,使用工具类实现
- Android学习总结一:adb的使用、打电话、Button监听两种方法、发短信、ADT23.0.2版本兼容问题
- Android之使用weight属性实现控件的按比例分配空间