Есть ли встроенный API для работы с функциями пинч-зума в Android - PullRequest
10 голосов
/ 15 апреля 2010

Я просто хотел узнать, есть ли какой-нибудь класс для использования мультитач-функций Android 2.1. В частности, я пытаюсь реализовать пинч-зум, и мне было интересно, нужно ли мне всегда измерять расстояние между двумя событиями касания и вычислять уровень масштабирования самостоятельно?

Спасибо, Крис

Ответы [ 5 ]

15 голосов
/ 01 мая 2010

Я пытаюсь сделать то же самое, и, как обычно, моим первым инстинктом было заглянуть в сам исходный код Android. Интересные биты, кажется, находятся в классе ScaleGestureDetector , который не является общедоступным, но его Javadoc говорит

@ hide Ожидает одобрения API

так что, надеюсь, он когда-нибудь станет публичным.

Обновление : ScaleGestureDetector теперь является частью API Android 2.2.

4 голосов
/ 15 апреля 2010

Полагаю, вам нужно будет самостоятельно рассчитать уровень масштабирования. Эта статья выглядит как хороший ресурс для начала: http://blogs.zdnet.com/Burnette/?p=1847

3 голосов
/ 10 октября 2011

Это зависит от версии Android, на которую вы хотите настроить таргетинг.

  • 2.2 или новее - используйте встроенный ScaleGestureDetector. Javadoc очень полезен, но см. Пример ниже.
  • 2.0-2.2 - ScaleGestureDetector не встроен, поэтому скопируйте версию с Android и скомпилируйте ее в свое приложение.
  • Pre-2.0 - Mutitouch не поддерживался до 2.0, поэтому вам нужно скопировать ScaleGestureDetector.java из Android и проделать еще немного работы, чтобы не использовать мультитач API на неподдерживаемых устройствах:

Чтобы избежать использования мультитач-API на устройствах до 2.0, вам нужно создать интерфейс для ScaleGestureDetector (Eclipse может сделать это через меню Refactor) и фиктивную реализацию, которую будут использовать устройства 1.x. Мы назовем наш интерфейс ScaleGestureDetectorInterface и нашу фиктивную реализацию FakeScaleGestureDetector.

Вот пример поддержки устройств до версии 2.0:

// 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;
    }
}
1 голос
/ 15 апреля 2010

Разработчиками были созданы хаки, включающие мультитач в браузере и браузере Dolphin. Они приходят в пользовательских roms, и я уверен, что они доступны для скачивания.

Кроме того, Google официально выпустила мультитач на Nexus One и Motorola. Это означает, что вы сможете получить официальный класс для него, но я уверен, что он предназначен для версии 2.1 Android.

Также я думаю, что было бы безопасно предположить, что вы хотите, чтобы это работало на рутованных телефонах. Это означает, что вы можете застрять в Android 2.1, а может и до 2.0.

0 голосов
/ 08 мая 2010

Вы пытаетесь увеличить изображение? Как простое решение, вы можете использовать WebView для отображения вашего изображения, оно имеет встроенную функцию масштабирования.

...