Можем ли мы использовать OnSwipe и OnClick в одном <Transition>для Android MotionLayout? - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу воспроизводить анимацию, когда пользователь нажимает или смахивает . Но можем ли мы обрабатывать оба поведения в MotionLayout? Они отлично работают отдельно, но если я добавлю OnClick и OnSwipe в той же сцене, будет работать только OnClick . Есть ли обходные пути?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Да, вы можете обойти эту проблему, удалив поведение onClick из вашей MotionScene и реализуя щелчок самостоятельно, расширяя MotionLayout и переопределяя dispatchTouchEvent.

В этой функции вы решаете, является ли событие касания щелчком внутри «целевой области», в которой вы хотите, чтобы происходило поведение onClick.

override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        if (touchEventInsideTargetView(clickableArea, ev)) {
            when (ev.action) {
                MotionEvent.ACTION_DOWN -> {
                    startX = ev.x
                    startY = ev.y
                }
                MotionEvent.ACTION_UP   -> {
                    val endX = ev.x
                    val endY = ev.y
                    if (isAClick(startX!!, endX, startY!!, endY)) {
                        if (doClickTransition()) {
                            return true
                        }
                    }
                }
            }
        }
 return super.dispatchTouchEvent(ev)
}

Сообщение об этом и полный пример кода можно найти здесь: https://medium.com/vrt-digital-studio/picture-in-picture-video-overlay-with-motionlayout-a9404663b9e7

0 голосов
/ 15 сентября 2018

Конечно, просто обработайте событие onTouch в своем родительском классе.Затем решите, что вы с ним делаете и на что отправлять.

onTouch(touchEvent){
    motionLayout.doClickIfYouWant(touchEvent)
    motionLayout.doSwipeIfYouWant(touchEvent)
}

Псевдокод, , но вы можете отправить его обоим, если вы сначала поймаете его и решите, кто его получит,Также не забудьте вернуть обработанный логический флаг из обратного вызова onTouch, чтобы убедиться, что он не обрабатывается дважды.Наконец, если на экране доступны другие элементы, вам, возможно, придется проверить координаты x, y вашего касания, чтобы определить, следует ли перейти к motionLayout или просто вернуть «не обработано» и позволить нативному поведению передать касание.

Надеюсь, это поможет.Также, если класс motionLayout не предоставляет методы, к которым нужно прикоснуться, чтобы отправить правильное событие прикосновения более чем в одно место, вы все равно можете получить его с помощью отражения.Конечно, отражение может быть немного медленнее, поэтому используйте его с осторожностью, но я должен был сделать это раньше для класса макета, в котором были дочерние изображения, которые мне нужно было перемещать, и управлял касанием на родительском уровне, чтобы решить,Изображение получает это или нет, но оно не было общедоступным, поэтому я посмотрел на код и коснулся его путем отражения без проблем.Рассматривайте это как последнее средство, и, возможно, все, что вам нужно, открыто.

Также помните, что некоторые инженеры презирают рефлексию, поэтому кодируйте с осторожностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...