Как обрабатывать события мультитач в Android с несколькими вложенными макетами?

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

Мой макет выглядит следующим образом:

Relative layout
|
|---Linear layout
|    \---Linear layout
|           \--Button A
|
|---Linear layout
     \---Button B

Две кнопки занимают примерно 50% размера экрана. Я хотел бы иметь возможность нажимать две кнопки одновременно одну за другой. Я могу нажать кнопку B, а затем кнопку A, но когда я нажимаю A, я не могу нажать B.

Кажется, что это нормальное поведение, если учесть, как Android обрабатывает события. Я погуглил свою проблему и нашел только сложные решения, которые включают переписывание пользовательского представления и метода «DispatchTouchEvent».

Знаете ли вы, есть ли простой способ избежать такого поведения (возможность нажать A, затем B и B, а затем A)?

Я написал минимальный пример: запустить действие со следующим макетом

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:splitMotionEvents="true"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="epl.groupe16.testbutton.MainActivity">

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:text="New Button"
        android:id="@+id/button" />

</LinearLayout>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:weightSum="2">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="New Button"
            android:id="@+id/button21"
            />
    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="New Button"
        android:id="@+id/button20"
        android:layout_weight="1"
        android:visibility="invisible" />
</LinearLayout>

I can press the lowest button, hold my touch and then click on the upper button but if I try the highest first, the lowest isn't clickable.

заранее спасибо


person Alexis Clarembeau    schedule 14.02.2016    source источник


Ответы (1)


Наконец мы обнаружили, что для этого нет простого решения. Но были некоторые обходные пути, которыми я хотел бы поделиться, если у кого-то возникла такая же проблема.

  • Во-первых, это можно сделать вручную: пересмотреть правильный способ распространения события, создав пользовательские представления и перезаписав метод «DispatchTouchEvent». Это довольно долго, но может решить проблему.

  • Кроме того, Google добавил PercentRelativeLayout в API 23, чтобы вы могли размещать все свои компоненты в одном представлении. Но мы нацелились на API 19, а Android Marshmallow не представляет большой процент текущих устройств.

  • Наконец, мы решили закодировать наш пользовательский прослушиватель SurfaceView и touchEvent. Мы рисовали наши компоненты в SurfaceView и вручную обрабатывали клики.

Я надеюсь, что это поможет вам :)

person Alexis Clarembeau    schedule 19.02.2016