package com.robert.maps.applib.reflection; import android.annotation.SuppressLint; import android.content.Context; import android.os.Build; import android.view.MotionEvent; import android.view.ScaleGestureDetector; public abstract class VerScaleGestureDetector { OnGestureListener mListener; public static VerScaleGestureDetector newInstance(Context context, OnGestureListener listener) { final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); VerScaleGestureDetector detector = null; if (sdkVersion < Build.VERSION_CODES.FROYO) { detector = new CupcakeDetector(); } else { detector = new FroyoDetector(context); } detector.mListener = listener; return detector; } public abstract boolean onTouchEvent(MotionEvent ev); public interface OnGestureListener { public void onScale(double aScaleFactor); public void onScaleEnd(); } private static class CupcakeDetector extends VerScaleGestureDetector { @Override public boolean onTouchEvent(MotionEvent ev) { return false; } } private static class FroyoDetector extends VerScaleGestureDetector { private ScaleGestureDetector mScaleDetector; @SuppressLint("NewApi") public FroyoDetector(Context context) { super(); mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); } @SuppressLint("NewApi") @Override public boolean onTouchEvent(MotionEvent ev) { return mScaleDetector.onTouchEvent(ev); } @SuppressLint("NewApi") private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mListener.onScale(detector.getScaleFactor()); return super.onScale(detector); } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { return super.onScaleBegin(detector); } @Override public void onScaleEnd(ScaleGestureDetector detector) { mListener.onScaleEnd(); super.onScaleEnd(detector); } } } }