編輯:Android開發實例
android touchexample 是Android項目組提供的一個處理Touch事件的示例,通過示例介紹了如何處理點擊事件以及多點觸摸事件.在Android版本中新加入了一個android.view.ScaleGestureDetector手勢Detector,用於處理多點觸摸事件,在http://android-touchexample.googlecode.com/svn/branches/cupcake 分支中的代碼演示了如何在Android的不同版本中處理各種事件.如何使程序在1.5到2.2之間處理事件. 下面是核心代碼,檢測系統版本,從而加載不同的事件處理代碼:
- package com.example.android.touchexample;
- import android.content.Context;
- import android.os.Build;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.ScaleGestureDetector;
- public abstract class VersionedGestureDetector {
- private static final String TAG = "VersionedGestureDetector";
- OnGestureListener mListener;
- public static VersionedGestureDetector newInstance(Context context,
- OnGestureListener listener) {
- final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
- VersionedGestureDetector detector = null;
- if (sdkVersion < Build.VERSION_CODES.ECLAIR) {
- detector = new CupcakeDetector();
- } else if (sdkVersion < Build.VERSION_CODES.FROYO) {
- detector = new EclairDetector();
- } else {
- detector = new FroyoDetector(context);
- }
- Log.d(TAG, "Created new " + detector.getClass());
- detector.mListener = listener;
- return detector;
- }
- public abstract boolean onTouchEvent(MotionEvent ev);
- public interface OnGestureListener {
- public void onDrag(float dx, float dy);
- public void onScale(float scaleFactor);
- }
- private static class CupcakeDetector extends VersionedGestureDetector {
- float mLastTouchX;
- float mLastTouchY;
- float getActiveX(MotionEvent ev) {
- return ev.getX();
- }
- float getActiveY(MotionEvent ev) {
- return ev.getY();
- }
- boolean shouldDrag() {
- return true;
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- mLastTouchX = getActiveX(ev);
- mLastTouchY = getActiveY(ev);
- break;
- }
- case MotionEvent.ACTION_MOVE: {
- final float x = getActiveX(ev);
- final float y = getActiveY(ev);
- if (shouldDrag()) {
- mListener.onDrag(x - mLastTouchX, y - mLastTouchY);
- }
- mLastTouchX = x;
- mLastTouchY = y;
- break;
- }
- }
- return true;
- }
- }
- private static class EclairDetector extends CupcakeDetector {
- private static final int INVALID_POINTER_ID = -1;
- private int mActivePointerId = INVALID_POINTER_ID;
- private int mActivePointerIndex = 0;
- @Override
- float getActiveX(MotionEvent ev) {
- return ev.getX(mActivePointerIndex);
- }
- @Override
- float getActiveY(MotionEvent ev) {
- return ev.getY(mActivePointerIndex);
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- final int action = ev.getAction();
- switch (action & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_DOWN:
- mActivePointerId = ev.getPointerId(0);
- break;
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- mActivePointerId = INVALID_POINTER_ID;
- break;
- case MotionEvent.ACTION_POINTER_UP:
- final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
- >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
- final int pointerId = ev.getPointerId(pointerIndex);
- if (pointerId == mActivePointerId) {
- // This was our active pointer going up. Choose a new
- // active pointer and adjust accordingly.
- final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
- mActivePointerId = ev.getPointerId(newPointerIndex);
- mLastTouchX = ev.getX(newPointerIndex);
- mLastTouchY = ev.getY(newPointerIndex);
- }
- break;
- }
- mActivePointerIndex = ev.findPointerIndex(mActivePointerId);
- return super.onTouchEvent(ev);
- }
- }
- private static class FroyoDetector extends EclairDetector {
- private ScaleGestureDetector mDetector;
- public FroyoDetector(Context context) {
- mDetector = new ScaleGestureDetector(context,
- new ScaleGestureDetector.SimpleOnScaleGestureListener() {
- @Override public boolean onScale(ScaleGestureDetector detector) {
- mListener.onScale(detector.getScaleFactor());
- return true;
- }
- });
- }
- @Override
- boolean shouldDrag() {
- return !mDetector.isInProgress();
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- mDetector.onTouchEvent(ev);
- return super.onTouchEvent(ev);
- }
- }
- }
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
上一節中講了App->Activity->Custom Title