您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐