It depends on the version of Android you wish to target.
- 2.2 or newer - use the built-in ScaleGestureDetector. The javadoc is very helpful, but see the example below.
- 2.0-2.2 - ScaleGestureDetector isn't built-in, so copy the version from Android and compile it into your application.
- Pre-2.0 - Mutitouch wasn't supported before 2.0, so you need to copy ScaleGestureDetector.java from Android and do a little more work to not use any multitouch APIs on unsupported devices:
To avoid using multitouch APIs on pre-2.0 devices, you need to create an interface for the ScaleGestureDetector (Eclipse can do this via the Refactor menu), and a dummy implementation which 1.x devices will use. We'll call our interface ScaleGestureDetectorInterface
and our dummy implementation FakeScaleGestureDetector
.
Here is a sample supporting pre-2.0 devices:
// If you don't care about pre-2.0 devices, just make this a
// ScaleGestureDetector and skip the API check in the constructor.
private final ScaleGestureDetectorInterface mScaleDetector;
public MyView {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ECLAIR) {
// Use the fake version which won't call any multitouch APIs
mScaleDetector = new FakeScaleGestureDetector();
} else {
// We are using SDK 2.0+, use the real implementation.
mScaleDetector = new ScaleGestureDetector(context,
new MyScaleListener());
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// On pre-2.0, the implementation does nothing.
return mScaleDetector.onTouchEvent(event);
}
private class MyScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureInterface detector) {
float scaleFactor = detector.getScaleFactor();
// If you were using a matrix to zoom an ImageView, you would do
// something like this:
mMatrix.postScale(scaleFactor, scaleFactor, detector.getFocusX(),
detector.getFocusY());
return true;
}
}