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

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

Спасибо Крис

5 ответов

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

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

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

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

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

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

  • 2.2 или новее - используйте встроенный ScaleGestureDetector. Javadoc очень полезен, но посмотрите пример ниже.
  • 2.0-2.2 - ScaleGestureDetector не является встроенным, поэтому скопируйте версию с Android и скомпилируйте ее в свое приложение.
  • До версии 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;
    }
}

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

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

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

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

Другие вопросы по тегам