一个按键的工具类,处理点击、双击、长按等事件

来源:互联网 发布:画图软件图标大全 编辑:程序博客网 时间:2024/06/07 19:29
public class KeyUtils {private boolean isVolumeDown = false;private boolean isVolumeUp = false;private boolean isMenu = false;private int currentKeyCode = 0;private static Boolean isDoubleClick = false;private static Boolean isLongClick = false;CheckForLongPress mPendingCheckForLongPress = null;CheckForDoublePress mPendingCheckForDoublePress = null;Handler mHandler = new Handler();Context mContext = null;private String TAG = "";public KeyUtils(Context context, String tag) {mContext = context;TAG = tag;}public void dispatchKeyEvent(KeyEvent event) {int keycode = event.getKeyCode();// 有不同按键按下,取消长按、短按的判断if (currentKeyCode != keycode) {removeLongPressCallback();isDoubleClick = false;}// 处理长按、单击、双击按键if (event.getAction() == KeyEvent.ACTION_DOWN) {checkForLongClick(event);} else if (event.getAction() == KeyEvent.ACTION_UP) {checkForDoubleClick(event);}if (keycode == KeyEvent.KEYCODE_VOLUME_DOWN) {if (event.getAction() == KeyEvent.ACTION_DOWN) {isVolumeDown = true;} else if (event.getAction() == KeyEvent.ACTION_UP) {isVolumeDown = false;}} else if (keycode == KeyEvent.KEYCODE_VOLUME_UP) {if (event.getAction() == KeyEvent.ACTION_DOWN) {isVolumeUp = true;} else if (event.getAction() == KeyEvent.ACTION_UP) {isVolumeUp = false;}} else if (keycode == KeyEvent.KEYCODE_MENU) {if (event.getAction() == KeyEvent.ACTION_DOWN) {isMenu = true;} else if (event.getAction() == KeyEvent.ACTION_UP) {isMenu = true;}}// 判断组合按键if (isVolumeDown&& isVolumeUp&& isMenu&& (keycode == KeyEvent.KEYCODE_VOLUME_UP|| keycode == KeyEvent.KEYCODE_VOLUME_DOWN || keycode == KeyEvent.KEYCODE_MENU)&& event.getAction() == KeyEvent.ACTION_DOWN) {// 组合按键事件处理;isVolumeDown = false;isVolumeUp = false;isMenu = false;}}private void removeLongPressCallback() {if (mPendingCheckForLongPress != null) {mHandler.removeCallbacks(mPendingCheckForLongPress);}}private void checkForLongClick(KeyEvent event) {int count = event.getRepeatCount();int keycode = event.getKeyCode();if (count == 0) {currentKeyCode = keycode;} else {return;}if (mPendingCheckForLongPress == null) {mPendingCheckForLongPress = new CheckForLongPress();}mPendingCheckForLongPress.setKeycode(event.getKeyCode());mHandler.postDelayed(mPendingCheckForLongPress, 1000);}class CheckForLongPress implements Runnable {int currentKeycode = 0;public void run() {isLongClick = true;longPress(currentKeycode);}public void setKeycode(int keycode) {currentKeycode = keycode;}}private void longPress(int keycode) {Log.i(TAG, "--longPress 长按事件--" + keycode);}private void singleClick(int keycode) {Log.i(TAG, "--singleClick 单击事件--" + keycode);}private void doublePress(int keycode) {Log.i(TAG, "---doublePress 双击事件--" + keycode);}private void checkForDoubleClick(KeyEvent event) {// 有长按时间发生,则不处理单击、双击事件removeLongPressCallback();if (isLongClick) {isLongClick = false;return;}if (!isDoubleClick) {isDoubleClick = true;if (mPendingCheckForDoublePress == null) {mPendingCheckForDoublePress = new CheckForDoublePress();}mPendingCheckForDoublePress.setKeycode(event.getKeyCode());mHandler.postDelayed(mPendingCheckForDoublePress, 500);} else {// 500ms内两次单击,触发双击isDoubleClick = false;doublePress(event.getKeyCode());}}class CheckForDoublePress implements Runnable {int currentKeycode = 0;public void run() {if (isDoubleClick) {singleClick(currentKeycode);}isDoubleClick = false;}public void setKeycode(int keycode) {currentKeycode = keycode;}}private void removeDoublePressCallback() {if (mPendingCheckForDoublePress != null) {mHandler.removeCallbacks(mPendingCheckForDoublePress);}}}
可以在工程中直接引用。
0 0
原创粉丝点击