Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a built in API for handling pinch-zoom functionality in Android

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

like image 431
krise Avatar asked Apr 15 '10 13:04

krise


4 Answers

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.

like image 67
Mirko N. Avatar answered Nov 15 '22 23:11

Mirko N.


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

like image 32
Mark B Avatar answered Nov 15 '22 23:11

Mark B


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;
    }
}
like image 37
Brad Avatar answered Nov 15 '22 23:11

Brad


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.

like image 45
Jonathan Czitkovics Avatar answered Nov 15 '22 21:11

Jonathan Czitkovics