1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/thoseyears-ohos-extension

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
TouchEvent.md 7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 01:25 d5812a8

Распространение сенсорных событий

Расширение механизма распространения событий dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent и реализация метода requestDisallowInterceptTouchEvent.

Внимание

  1. Если корневой макет или промежуточный ComponentContainer реализованы как View, а не ViewGroup, события не будут распространяться дальше.
  2. В дереве представлений могут быть разрывы, то есть появляться компоненты, которые не реализуют View или ViewGroup. В этом случае события будут пропускаться и передаваться дальше.
  3. Для компонентов, которые не реализовали View или ViewGroup и установили setTouchEventListener, событие будет потребляться сразу после возврата true в обратном вызове, что предотвратит его распространение.
  4. При встрече с super.onTouchEvent или super.onInterceptTouchEvent необходимо изучить логику родительского класса и перенести её, если это обычный макет или компонент, обычно можно игнорировать или возвращать false.
  5. Если встречается super.dispatchTouchEvent, можно напрямую использовать dispatchTouchEvent из ViewGroupHelper/ViewHelper для замены.
  6. На данный момент поддерживается только распространение одиночных сенсорных событий.

Использование

ComponentContainer

  1. ComponentContainer должен реализовывать Component.TouchEventListener и интерфейс ViewGroup:
public class ViewParent extends DirectionalLayout implements Component.TouchEventListener, ViewGroup
  1. Установите setTouchEventListener:
setTouchEventListener(this);
  1. Вызовите метод DispatchHelper.dispatch в ohos.onTouchEvent:
@Override
public boolean onTouchEvent(Component component, TouchEvent event) {
    return DispatchHelper.dispatch(component, event);
}
  1. Перенаправьте методы dispatchTouchEvent, isConsumed и requestDisallowInterceptTouchEvent интерфейса ViewGroup в ViewGroupHelper и реализуйте конкретную логику распространения в onInterceptTouchEvent и onTouchEvent:
    ViewGroupHelper impl = new ViewGroupHelper();

    @Override
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        impl.requestDisallowInterceptTouchEvent(disallowIntercept);
    }

    @Override
    public boolean onInterceptTouchEvent(TouchEvent ev) {
        return false;
    }

    @Override
    public boolean dispatchTouchEvent(TouchEvent event) {
        return impl.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(TouchEvent event) {
        return false;
    }

    @Override
    public boolean isConsumed() {
        return impl.isConsumed();
    }

Component

  1. Компонент должен реализовать Component.TouchEventListener и View:
public class ViewChild extends ScrollView implements Component.TouchEventListener, View
  1. Установите setTouchEventListener:
setTouchEventListener(this);
  1. Вызов метода DispatchHelper.dispatch в ohos.onTouchEvent:
@Override
public boolean onTouchEvent(Component component, TouchEvent event) {
    return DispatchHelper.dispatch(component, event);
}
  1. Переадресуйте методы dispatchTouchEvent и isConsumed интерфейса ViewGroup в ViewHelper и реализуйте конкретную логику распространения в onTouchEvent:
    ViewHelper impl = new ViewHelper();

    @Override
    public boolean dispatchTouchEvent(TouchEvent event) {
        return impl.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(TouchEvent event) {
        return true;
    }

    @Override
    public boolean isConsumed() {
        return impl.isConsumed();
    }

requestDisallowInterceptTouchEvent

Если компоненту требуется, чтобы родительский элемент не перехватывал события, можно вызвать метод requestDisallowInterceptTouchEvent DispatchHelper:

DispatchHelper.requestDisallowInterceptTouchEvent(this, false);

// postRequestDisallowInterceptTouchEvent будет использовать EventHandler для задержки выполнения функции
// чтобы избежать ситуации, когда getComponentParent имеет значение null при вызове requestDisallowInterceptTouchEvent в конструкторе
DispatchHelper.postRequestDisallowInterceptTouchEvent(this, false);

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

Реализация

Поскольку распространение событий в ohos происходит в пузырьковой форме, то есть события сначала достигают целевого компонента, и если целевой компонент не потребляет событие, оно всплывает к родительскому компоненту. В то время как в Android события передаются сначала родительскому компоненту, затем распределяются и передаются целевому компоненту. Основная функция DispatchHelper заключается в поиске всех компонентов в дереве представлений, которые реализуют View или ViewGroup, и вызове функции dispatchTouchEvent верхнего уровня для распространения события вниз. Он также фильтрует повторяющиеся события, вызванные всплытием событий. ViewHelper и ViewGroupHelper в основном реализуют логику функций dispatchTouchEvent View и ViewGroup в Android.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/thoseyears-ohos-extension.git
git@api.gitlife.ru:oschina-mirror/thoseyears-ohos-extension.git
oschina-mirror
thoseyears-ohos-extension
thoseyears-ohos-extension
master