我自己用Photoshop画了2种按钮图片,每种有3种状态,分为:normal、focus、press等。
放在工程的“res/drawable/”目录下。
ImageButton要使用这些图片做出漂亮的效果,可以在Java代码中使用setImageResource(int)方法,我采用xml文件中设置android:src属性。
在工程目录“res/drawable/”下新建“imgbt1.xml”,文件内容为:
新建“imgbt2.xml”,文件内容为:
使用方法:
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实现,关键代码有给出,但都是抄来抄去,且并不完全,决定实现它。
增加个接口,用来实现监听事件。
既然要实现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类的代码:
在布局xml文件中,添加RepeatButton,需要以下定义。
注意
:RepeatButton是我们自定义的类,所以引用的时候,要加上全名。
在Activity中,要使用的话,先要实现RepeatListener:
然后设置setRepeatListener,实现监听:
下面给出源码的下载地址: http://download.youkuaiyun.com/detail/manp1212/4400624
放在工程的“res/drawable/”目录下。
ImageButton要使用这些图片做出漂亮的效果,可以在Java代码中使用setImageResource(int)方法,我采用xml文件中设置android:src属性。
在工程目录“res/drawable/”下新建“imgbt1.xml”,文件内容为:
- <?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”,文件内容为:
- <?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>
使用方法:
- <ImageButton
- android:id="@+id/imgbt1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="#a000ff00"
- android:src="@drawable/imgbt1"
- />
表达式顺序是“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实现,关键代码有给出,但都是抄来抄去,且并不完全,决定实现它。
增加个接口,用来实现监听事件。
- 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类的代码:
- /*
- * Copyright (C) 2012 Manpeng
- *
- * http://blog.youkuaiyun.com/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,需要以下定义。
- <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"
- />
在Activity中,要使用的话,先要实现RepeatListener:
- public class MyRepeatListener implements RepeatListener
- {
- public void onRepeat(View v, long duration, int repeatcount)
- {
- //加入处理代码
- }
- }
然后设置setRepeatListener,实现监听:
- RepeatButton rb = (RepeatButton)findViewById(R.id.rptbt3);
- rb.setRepeatListener(new MyRepeatListener(), 5000);
下面给出源码的下载地址: http://download.youkuaiyun.com/detail/manp1212/4400624