注:一定要通过view的onTouchEvent调用mScaleGestureDetector.onTouchEvent(ev);,只有这样
才能调用回调函数:onScaleBegin
具体可以参加:android源码:KenBurnsActivity.java
下面是转载的文章:
 
Detects transformation gestures involving more than one pointer ("multitouch") using the supplied MotionEvents.
 TheScaleGestureDetector.OnScaleGestureListener callback will notify users when a particular gesture event has occurred. This class should only be used with MotionEvents reported via touch. To use this class:
 - Create an instance of the ScaleGestureDetector for your View
- In the (View's )onTouchEvent(MotionEvent) method ensure you call (ScaleGestureDetector's )onTouchEvent(MotionEvent). The methods defined in your callback will be executed when the events occur.
下面是测试的代码:
 -  public class TouchView extends View {
-  
-   private Context mContext;
-   private Paint mPaint;
-   private Rect mRect;
-   private ScaleGestureDetector mScaleGestureDetector;
-   
-   public TouchView(Context context) {
-    super(context);
-    mContext = context;
-    mPaint = new Paint();
-    mPaint.setColor(Color.BLUE);
-    mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
-    mRect = new Rect();
-    mRect.left = 10;
-    mRect.top = 10;
-    mRect.right = 300;
-    mRect.bottom = 400;
-    
-    mScaleGestureDetector = new ScaleGestureDetector(context, listener);
-   }
-   
-   OnScaleGestureListener listener = new OnScaleGestureListener() {
-    
-    public void onScaleEnd(ScaleGestureDetector detector) {
-     // TODO Auto-generated method stub
-     Log.i("OnScaleGestureListener", "onScaleEnd");
-    }
-    
-    public boolean onScaleBegin(ScaleGestureDetector detector) {
-     // TODO Auto-generated method stub
-     Log.i("OnScaleGestureListener", "onScaleBegin detector.getCurrentSpan() = " + detector.getCurrentSpan());
-     detector.getCurrentSpan();
-     return true;
-    }
-    
-    public boolean onScale(ScaleGestureDetector detector) {
-     // TODO Auto-generated method stub
-     float cur = detector.getCurrentSpan();
-     float pre = detector.getPreviousSpan();
-     float cp = cur - pre;
-     Log.i("OnScaleGestureListener", "onScale detector.getCurrentSpan() = " + cur
-       + " detector.getPreviousSpan() = " + pre 
-       + " cur - pre = " + (cur - pre));
-     if (cp < -100 && !mScaled) {
-      mScaled = true;
-      mRect.left = 10+ 50;
-      mRect.top = 10 + 50;
-      mRect.right = 300 - 50;
-      mRect.bottom = 400 - 50;
-      invalidate();
-     } else if (cp > 100 && mScaled) {
-      mScaled = false;
-      mRect.left = 10;
-      mRect.top = 10 ;
-      mRect.right = 300 ;
-      mRect.bottom = 400;
-      invalidate();
-     }
-     return false;
-    }
-   };
-  
-   boolean mScaled = false;
-   /*@Override
-   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-    int width = MeasureSpec.getSize(widthMeasureSpec);
-    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-    int height = MeasureSpec.getSize(heightMeasureSpec);
-    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-   }*/
-  
-  
-  
-   @Override
-   protected void onDraw(Canvas canvas) {
-    canvas.drawRect(mRect, mPaint);
-   }
-  
-  
-  
-   @Override
-   public boolean onTouchEvent(MotionEvent event) {
-    System.out.println("event.getPointerCount() : " + event.getPointerCount());
-    mScaleGestureDetector.onTouchEvent(event);
-    return true;
-   }
- }