日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android游戲開發(fā)之一:長按事件的原理

本Android游戲開發(fā)教程概述

本游戲開發(fā)教程主要從控制方法(按鍵、軌跡球、觸屏、重力感應(yīng)、攝像頭、話筒氣流、光線亮度)、圖形View(高效繪圖技術(shù)如雙緩沖)、音效(游戲音樂) 以及***的OpenGL ES(Java層)和NDK的OpenGL和J2ME游戲移植到Android方法,當(dāng)然還有一些游戲?qū)崿F(xiàn)慣用方法,比如地圖編輯器,在Android OpenGL如何使用MD2文件,各部分講述下Android游戲開發(fā)的過程最終實(shí)現(xiàn)一個(gè)比較完整的游戲引擎。

長按事件的原理及代碼示例

對(duì)于很多游戲使用屏幕控制一般需要考慮長按事件,比如在動(dòng)作類的游戲中需要長按發(fā)射武器,結(jié)合Android Button模型,我們實(shí)現(xiàn)一個(gè)帶圖片的Button的長按,為了更清晰的顯示原理,Android開發(fā)網(wǎng)這里使用ImageButton作為基類。

 
 
  1. public class RepeatingImageButton extends ImageButton {    
  2.    private long mStartTime; //記錄長按開始    
  3.    private int mRepeatCount; //重復(fù)次數(shù)計(jì)數(shù)    
  4.    private RepeatListener mListener;    
  5.    private long mInterval = 500; //Timer觸發(fā)間隔,即每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); //允許獲得焦點(diǎn)    
  15.        setLongClickable(true); //啟用長按事件    
  16.    }    
  17.    public void setRepeatListener(RepeatListener l, long interval) { //實(shí)現(xiàn)重復(fù)按下事件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手機(jī)上的物理按鍵事件    
  31.              removeCallbacks(mRepeater);      
  32.            if (mStartTime != 0) {    
  33.                doRepeat(true);    
  34.                mStartTime = 0;    
  35.            }    
  36.        }    
  37.        return super.onTouchEvent(event);    
  38.    }    
  39.  //處理導(dǎo)航鍵事件的中鍵或軌跡球按下事件    
  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.   //當(dāng)按鍵彈起通知長按結(jié)束    
  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); //取消重復(fù)listener捕獲    
  59.            if (mStartTime != 0) {    
  60.                doRepeat(true); //如果長按事件累計(jì)時(shí)間不為0則說明長按了    
  61.                mStartTime = 0; //重置長按計(jì)時(shí)器    
  62.            }    
  63.        }    
  64.        return super.onKeyUp(keyCode, event);    
  65.    }    
  66.    private Runnable mRepeater = new Runnable() {  //在線程中判斷重復(fù)    
  67.        public void run() {    
  68.            doRepeat(false);    
  69.            if (isPressed()) {    
  70.                postDelayed(this, mInterval); //計(jì)算長按后延遲下一次累加    
  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.   //下面是重復(fù)Button Listener接口的定義,調(diào)用時(shí)在Button中先使用setRepeatListener()方法實(shí)現(xiàn)RepeatListener接口    
  81.        
  82.    public interface RepeatListener {    
  83.             void onRepeat(View v, long duration, int repeatcount); //參數(shù)一為用戶傳入的Button對(duì)象,參數(shù)二為延遲的毫秒數(shù),第三位重復(fù)次數(shù)回調(diào)。    
  84.    }    

本類大家可以直接在自己的View中implements實(shí)現(xiàn)RepeatListener接口即可。


分享名稱:Android游戲開發(fā)之一:長按事件的原理
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/dpgjiij.html