Android游戏开发之一:长按事件的原理

移动开发 Android 游戏开发
本系列教程讲解的是Android游戏开发,大家都应该知道,Android Market下载量比较多的都是游戏。将来如果手机网游发展起来的话,Android会因为使用Java从而比iPhone的入门门槛更低。

本Android游戏开发教程概述

本游戏开发教程主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐) 以及***的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,各部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。

长按事件的原理及代码示例

对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类。

  1. public class RepeatingImageButton extends ImageButton {    
  2.    private long mStartTime; //记录长按开始    
  3.    private int mRepeatCount; //重复次数计数    
  4.    private RepeatListener mListener;    
  5.    private long mInterval = 500//Timer触发间隔,即每0.5秒算一次按下    
  6.    public RepeatingImageButton(Context context) {    
  7.        this(context, null);    
  8.    }    
  9.    public RepeatingImageButton(Context context, AttributeSet attrs) {    
  10.        this(context, attrs, android.R.attr.imageButtonStyle);    
  11.    }    
  12.    public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) {    
  13.        super(context, attrs, defStyle);    
  14.        setFocusable(true); //允许获得焦点    
  15.        setLongClickable(true); //启用长按事件    
  16.    }    
  17.    public void setRepeatListener(RepeatListener l, long interval) { //实现重复按下事件listener    
  18.        mListener = l;    
  19.        mInterval = interval;     
  20.    }    
  21.    @Override   
  22.    public boolean performLongClick() {    
  23.        mStartTime = SystemClock.elapsedRealtime();    
  24.        mRepeatCount = 0;    
  25.        post(mRepeater);    
  26.        return true;    
  27.    }    
  28.    @Override   
  29.    public boolean onTouchEvent(MotionEvent event) {    
  30.        if (event.getAction() == MotionEvent.ACTION_UP) {  //   本方法原理同onKeyUp的一样,这里处理屏幕事件,下面的onKeyUp处理Android手机上的物理按键事件    
  31.              removeCallbacks(mRepeater);      
  32.            if (mStartTime != 0) {    
  33.                doRepeat(true);    
  34.                mStartTime = 0;    
  35.            }    
  36.        }    
  37.        return super.onTouchEvent(event);    
  38.    }    
  39.  //处理导航键事件的中键或轨迹球按下事件    
  40.    @Override   
  41.    public boolean onKeyDown(int keyCode, KeyEvent event) {    
  42.        switch (keyCode) {    
  43.            case KeyEvent.KEYCODE_DPAD_CENTER:     
  44.            case KeyEvent.KEYCODE_ENTER:    
  45.    
  46.                super.onKeyDown(keyCode, event);    
  47.                return true;    
  48.        }    
  49.        return super.onKeyDown(keyCode, event);    
  50.    }    
  51.   //当按键弹起通知长按结束    
  52.    @Override   
  53.    public boolean onKeyUp(int keyCode, KeyEvent event) {    
  54.        switch (keyCode) {    
  55.        case KeyEvent.KEYCODE_DPAD_CENTER:    
  56.        case KeyEvent.KEYCODE_ENTER:    
  57.               
  58.            removeCallbacks(mRepeater); //取消重复listener捕获    
  59.            if (mStartTime != 0) {    
  60.                doRepeat(true); //如果长按事件累计时间不为0则说明长按了    
  61.                mStartTime = 0//重置长按计时器    
  62.            }    
  63.        }    
  64.        return super.onKeyUp(keyCode, event);    
  65.    }    
  66.    private Runnable mRepeater = new Runnable() {  //在线程中判断重复    
  67.        public void run() {    
  68.            doRepeat(false);    
  69.            if (isPressed()) {    
  70.                postDelayed(this, mInterval); //计算长按后延迟下一次累加    
  71.            }    
  72.        }    
  73.    };    
  74.    private  void doRepeat(boolean last) {    
  75.        long now = SystemClock.elapsedRealtime();    
  76.        if (mListener != null) {    
  77.            mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);    
  78.        }    
  79.    }    
  80.   //下面是重复Button Listener接口的定义,调用时在Button中先使用setRepeatListener()方法实现RepeatListener接口    
  81.        
  82.    public interface RepeatListener {    
  83.             void onRepeat(View v, long duration, int repeatcount); //参数一为用户传入的Button对象,参数二为延迟的毫秒数,第三位重复次数回调。    
  84.    }    

本类大家可以直接在自己的View中implements实现RepeatListener接口即可。

责任编辑:闫佳明 来源: jizhuomi
相关推荐

2013-05-21 14:22:29

Android游戏开发捕获屏幕双击事件

2012-05-15 13:10:57

HTML5

2013-05-21 11:33:11

Android游戏开发按键中断事件

2021-10-09 19:05:06

channelGo原理

2022-02-11 14:39:11

游戏JS鸿蒙

2013-05-20 15:42:22

2013-05-21 16:17:13

2013-05-21 15:28:31

2019-03-12 10:46:17

TCP协议算法

2021-03-18 23:04:41

Solidity开发智能

2016-04-12 10:07:55

AndroidViewList

2013-04-15 15:22:06

2011-06-27 10:45:06

BattleheartAndroid游戏开发

2010-03-03 15:06:52

Android 游戏开

2013-05-20 16:12:23

2014-07-31 10:57:15

Android组件Service

2013-05-21 10:42:48

Android游戏开发Bitmap位图旋转

2021-10-30 18:38:49

Java c++反射

2011-04-25 14:45:38

2011-09-14 09:30:27

点赞
收藏

51CTO技术栈公众号