I just wanted to know if there is some kind of class to use the multitouch features of android 2.1. Specifically I am trying to implement pinch-zoom and was wondering if I always have to measure the distance between two touch events and calculate the zoom level on my own?
Thanks, chris
I'm trying to do the same thing, and as usual my first instinct was to look into the Android source code itself. The interesting bits seem to be in class ScaleGestureDetector, which is not public but its javadoc says
@hide Pending API approval
so hopefully it will become public at some point.
Update: ScaleGestureDetector is now part of the Android 2.2 API.
I believe you will need to calculate the zoom level yourself. This article looks like a good resource to get you started: http://blogs.zdnet.com/Burnette/?p=1847
It depends on the version of Android you wish to target.
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;
}
}
There have been hacks created by developers that enable multitouch on the browser and Dolphin browser. These come in custom roms and I am sure that they are downloadable.
Also Google has released multi-touch officially on the Nexus One and Motorola on their milestone. This means that you should be able to get an official class for it but I bet that its for version 2.1 of Android.
Also I think that it would be safe to assume that you want this to work on rooted phones. Than means that you may be stuck at using Android 2.1 and maybe all the way down to 2.0.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With