Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android touchexample

android touchexample

編輯:Android開發實例

android touchexample 是Android項目組提供的一個處理Touch事件的示例,通過示例介紹了如何處理點擊事件以及多點觸摸事件.在Android版本中新加入了一個android.view.ScaleGestureDetector手勢Detector,用於處理多點觸摸事件,在http://android-touchexample.googlecode.com/svn/branches/cupcake 分支中的代碼演示了如何在Android的不同版本中處理各種事件.如何使程序在1.5到2.2之間處理事件. 下面是核心代碼,檢測系統版本,從而加載不同的事件處理代碼:

 

 
  1. package com.example.android.touchexample;  
  2.  
  3. import android.content.Context;  
  4. import android.os.Build;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.view.ScaleGestureDetector;  
  8.  
  9. public abstract class VersionedGestureDetector {  
  10.     private static final String TAG = "VersionedGestureDetector";  
  11.       
  12.     OnGestureListener mListener;  
  13.       
  14.     public static VersionedGestureDetector newInstance(Context context,  
  15.             OnGestureListener listener) {  
  16.         final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);  
  17.         VersionedGestureDetector detector = null;  
  18.         if (sdkVersion < Build.VERSION_CODES.ECLAIR) {  
  19.             detector = new CupcakeDetector();  
  20.         } else if (sdkVersion < Build.VERSION_CODES.FROYO) {  
  21.             detector = new EclairDetector();  
  22.         } else {  
  23.             detector = new FroyoDetector(context);  
  24.         }  
  25.           
  26.         Log.d(TAG, "Created new " + detector.getClass());  
  27.         detector.mListener = listener;  
  28.           
  29.         return detector;  
  30.     }  
  31.       
  32.     public abstract boolean onTouchEvent(MotionEvent ev);  
  33.       
  34.     public interface OnGestureListener {  
  35.         public void onDrag(float dx, float dy);  
  36.         public void onScale(float scaleFactor);  
  37.     }  
  38.  
  39.     private static class CupcakeDetector extends VersionedGestureDetector {  
  40.         float mLastTouchX;  
  41.         float mLastTouchY;  
  42.           
  43.         float getActiveX(MotionEvent ev) {  
  44.             return ev.getX();  
  45.         }  
  46.  
  47.         float getActiveY(MotionEvent ev) {  
  48.             return ev.getY();  
  49.         }  
  50.           
  51.         boolean shouldDrag() {  
  52.             return true;  
  53.         }  
  54.  
  55.         @Override 
  56.         public boolean onTouchEvent(MotionEvent ev) {  
  57.             switch (ev.getAction()) {  
  58.             case MotionEvent.ACTION_DOWN: {  
  59.                 mLastTouchX = getActiveX(ev);  
  60.                 mLastTouchY = getActiveY(ev);  
  61.                 break;  
  62.             }  
  63.             case MotionEvent.ACTION_MOVE: {  
  64.                 final float x = getActiveX(ev);  
  65.                 final float y = getActiveY(ev);  
  66.                   
  67.                 if (shouldDrag()) {  
  68.                     mListener.onDrag(x - mLastTouchX, y - mLastTouchY);  
  69.                 }  
  70.                   
  71.                 mLastTouchX = x;  
  72.                 mLastTouchY = y;  
  73.                 break;  
  74.             }  
  75.             }  
  76.             return true;  
  77.         }  
  78.     }  
  79.       
  80.     private static class EclairDetector extends CupcakeDetector {  
  81.         private static final int INVALID_POINTER_ID = -1;  
  82.         private int mActivePointerId = INVALID_POINTER_ID;  
  83.         private int mActivePointerIndex = 0;  
  84.  
  85.         @Override 
  86.         float getActiveX(MotionEvent ev) {  
  87.             return ev.getX(mActivePointerIndex);  
  88.         }  
  89.  
  90.         @Override 
  91.         float getActiveY(MotionEvent ev) {  
  92.             return ev.getY(mActivePointerIndex);  
  93.         }  
  94.  
  95.         @Override 
  96.         public boolean onTouchEvent(MotionEvent ev) {  
  97.             final int action = ev.getAction();  
  98.             switch (action & MotionEvent.ACTION_MASK) {  
  99.             case MotionEvent.ACTION_DOWN:  
  100.                 mActivePointerId = ev.getPointerId(0);  
  101.                 break;  
  102.             case MotionEvent.ACTION_CANCEL:  
  103.             case MotionEvent.ACTION_UP:  
  104.                 mActivePointerId = INVALID_POINTER_ID;  
  105.                 break;  
  106.             case MotionEvent.ACTION_POINTER_UP:  
  107.                 final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)   
  108.                         >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;  
  109.                 final int pointerId = ev.getPointerId(pointerIndex);  
  110.                 if (pointerId == mActivePointerId) {  
  111.                     // This was our active pointer going up. Choose a new  
  112.                     // active pointer and adjust accordingly.  
  113.                     final int newPointerIndex = pointerIndex == 0 ? 1 : 0;  
  114.                     mActivePointerId = ev.getPointerId(newPointerIndex);  
  115.                     mLastTouchX = ev.getX(newPointerIndex);  
  116.                     mLastTouchY = ev.getY(newPointerIndex);  
  117.                 }  
  118.                 break;  
  119.             }  
  120.  
  121.             mActivePointerIndex = ev.findPointerIndex(mActivePointerId);  
  122.             return super.onTouchEvent(ev);  
  123.         }  
  124.     }  
  125.       
  126.     private static class FroyoDetector extends EclairDetector {  
  127.         private ScaleGestureDetector mDetector;  
  128.           
  129.         public FroyoDetector(Context context) {  
  130.             mDetector = new ScaleGestureDetector(context,  
  131.                     new ScaleGestureDetector.SimpleOnScaleGestureListener() {  
  132.                 @Override public boolean onScale(ScaleGestureDetector detector) {  
  133.                     mListener.onScale(detector.getScaleFactor());  
  134.                     return true;  
  135.                 }  
  136.             });  
  137.         }  
  138.           
  139.         @Override 
  140.         boolean shouldDrag() {  
  141.             return !mDetector.isInProgress();  
  142.         }  
  143.           
  144.         @Override 
  145.         public boolean onTouchEvent(MotionEvent ev) {  
  146.             mDetector.onTouchEvent(ev);  
  147.             return super.onTouchEvent(ev);  
  148.         }  
  149.     }  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved