Как заставить Android ZoomButtonsController и GestureDetector ладить - PullRequest
1 голос
/ 26 сентября 2011

Я застрял на этом некоторое время, и хотя я нашел обходной путь, я не совсем понимаю , почему это работает, и я должен , чтобы правильно его реализовать! Там также, кажется, не хватает информации о ZoomButtonsController.

В других статьях в моем приложении реализована функция жестов «смахивание». Однако одним касанием я также хотел, чтобы кнопки зума появлялись программно. У меня уже был OnTouchListener на основе GestureDetector для этого ScrollView, и поэтому я добавил ZoomButtonsController в качестве OnZoomListener для него (вместе с кодом для обработки onSingleTapConfirmed и другими подобными вещами).

Все работало нормально - пока не появились кнопки зума. С этого момента (при условии постоянной видимости) никакие жесты не работают, даже не нажимая, даже после того, как кнопки масштабирования исчезают! Вы можете нажимать кнопки масштабирования, пока они находятся на экране, и прокрутка по-прежнему работает нормально, но жесты исчезли.

Я наконец-то придумал "исправить": если OnZoomListener.onVisibilityChanged () срабатывает невидимым, я вызываю setOnTouchListener () моегоScrollView для восстановления gestListener (как я это делал в onCreate ()). Жесты снова работать нормально.

Редактировать: если вы делаете это, когда onVisibilityChanged () запускает видимое, вы получаете жесты, работающие сразу, НО это отключает кнопки масштабирования, так что это не так здорово! Было бы неплохо иметь оба ...

Итак, правильно ли я делаю способ использования ZoomButtonsController, а если нет, то как? Что еще более важно, почему, когда появляются кнопки масштабирования, они, кажется, навсегда заменяют мой OnTouchListener? Предполагается ли, что ZoomButtonsController угоняет жесты в настоящее время после его запуска? Является ли это чем-то более простым, чем это (какое-то общее свойство слушателей)?

1 Ответ

2 голосов
/ 19 июля 2012

Я боролся с этой проблемой некоторое время, прежде чем нашел решение. Я не уверен, что это самый правильный вариант, но он отлично работает.

Концепция:

1 - Не добавляйте виджет ZoomButtonsController непосредственно в представление, где они вам нужны. События onTouch будут конфликтовать. Вместо этого вам нужно добавить виджет ZoomButtonsController в новый вид и добавить этот вид в тот же макет, где находится вид, в который вы хотите добавить кнопки масштабирования.

2 - представление, в которое был добавлен ZoomButtonsController, должно быть последним, добавляемым в родительский макет. Таким образом, он будет вызван первым, и если кнопки масштабирования не будут нажаты, событие onTouch будет передано вашему виду для обработки.

Код с примером:

    //First my view where I need the zoom buttons
    imageView = new ImageView(context);
    LayoutParams layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    imageView.setLayoutParams(layoutParams);
    imageView.setOnTouchListener(onTouchListener);
    relativeLayout.addView(imageView);

    //Secondly the view where the buttons are added     
    View zoomView = new View(context);
    LayoutParams layoutParamsZoom = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    zoomView.setLayoutParams(layoutParamsZoom);
    relativeLayout.addView(zoomView);
    zoomButtonsController = new ZoomButtonsController(zoomView); 
    zoomButtonsController.setOnZoomListener(onZoomListener);

Наконец, вам просто нужно добавить слушателя к виджету масштабирования:

ZoomButtonsController.OnZoomListener onZoomListener = new ZoomButtonsController.OnZoomListener() {

    @Override
    public void onZoom(boolean zoomIn) {
        Log.d(TAG, "onZoom: " +  zoomIn);
        if(zoomIn){ 
            setZoom(currentZoom +1); 
        }else{ 
            setZoom(currentZoom -1); 
        } 
    }

    @Override
    public void onVisibilityChanged(boolean visible) {
        // TODO Auto-generated method stub
    }
};

Удачи, Луис

...