it-swarm.com.ru

Отключить касание нескольких пальцев в моем приложении

Мое приложение использует одну активность для размещения нескольких фрагментов. Каждый раз один фрагмент отображается на экране телефона. Вид каждого фрагмента состоит из нескольких значков изображений. 

В настоящее время пользователь может нажимать на две иконки одновременно двумя пальцами (при каждом нажатии пальца на одну иконку). Я хочу отключить эту функцию мультитач в моем приложении, чтобы разрешить вступает в силу только одно нажатие значка за раз .

Я пробовал следующие способы:

Способ 1: в теме моего приложения я добавил:

<item name="Android:windowEnableSplitTouch">false</item>

Способ 2: В Android Manifest XML я добавил:

<uses-feature Android:name="Android.hardware.touchscreen.multitouch" Android:required="false" />

Способ 3: в моей деятельности:

@Override
public boolean onTouchEvent(MotionEvent event) {

    if(event.getPointerCount() > 1) {
        System.out.println("Multitouch detected!");
        return true;
    }
    else
       return super.onTouchEvent(event);
    }

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

18
Leem.fin

Для случая: у вас есть несколько кнопок, и вы хотите сделать выбранной только одну кнопку. В parent (NOT ROOT, просто parent of child) кнопок добавьте в свои xml-параметры

Android: splitMotionEvents = "ложь"

И это все . Пример:

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:splitMotionEvents="false" <-----------!!!
    >

    <Button
    Android:id="@+id/button_main_1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="button1" />

    <Button
    Android:id="@+id/button_main_2"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="button2" />

    <Button
    Android:id="@+id/button_main_3"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="button3" />
</LinearLayout>

Btw. Если у вас есть 2 линейных макета с 3 кнопками на макет, вы должны установить этот splitMotionEvents в этих двух макетах , а также в parent этих 2 линейных макетов. В противном случае вы сможете нажать только одну кнопку для каждого макета (тогда сумма = 2). Я надеюсь, что вы поняли. :)

Ни одно из других решений не сработало для меня или не было слишком хромым.

36
deadfish

Да, я также однажды столкнулся с этой проблемой И нашел решение, что Android: splitMotionEvents = "false" Это будет работать только для направления дочерних элементов макета.

Пример

Например, если вы создадите два макета A и B и В A у вас есть две кнопки b1, b2 В B у вас есть две кнопки b3, b4

и A, и B находятся в Parent Layout Прежде всего вы должны очистить, что эти кнопки не являются прямыми потомками Parent Layout.

В родительском макете есть только двое детей A и B

Чем, если вы добавите Android: splitMotionEvents = "false" к Parent Layout , Тогда мультитач не будет работать на Layout A и Layout B, но он будет работать на каждой кнопке b1, b2, b3, b4, потому что это не прямые дети родительского макета

Итак, если вы хотите, чтобы мультитач не работал и на этих кнопках Чем нужно добавить Android: splitMotionEvents = "false" это для каждого макета отдельно 

Есть несколько случаев:

1). Если вы только добавляете Android: splitMotionEvents = "false" на макете A , То вы не можете одновременно нажать кнопку b1 и кнопку b2 , Но вы можете нажать кнопку b1 или b2 и кнопку B3 или B4 одновременно.

2). прямо напротив случая 1.

3). Но если вы добавите Android: splitMotionEvents = "false" на обоих макетах, то вы не сможете одновременно коснуться любых двух кнопок на экране.

<LinearLayout 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:orientation="vertical"
Android:splitMotionEvents="false" >

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:splitMotionEvents="false" >

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b1" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b2" />
</LinearLayout>

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:splitMotionEvents="false" >

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b3" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="b4" />
</LinearLayout>

Я думаю, что это может помочь вам.

10
sachin pareek

Вы можете поместить пользователя GestureOverlayView по всему экрану и разрешить обработку первого касания только нижним представлениям.

Вы должны настроить onTouchListener для этого прозрачного представления, которое делает что-то вроде этого:

gestureOverlayView.setOnTouchListener(new View.OnTouchListnener(){
    @Override
    public boolean onTouch(View v, MotionEvent e){
       // True means the event is ignored by the overlayed views 
       return e.getPointerCount() > 1 ? true : false;
    }
}
1
Emil Davtyan