web-dev-qa-db-ja.com

アプリでマルチフィンガータッチを無効にする

私のアプリは1つのアクティビティを使用して複数のフラグメントをホストしています。電話スクリーンに1つのフラグメントが表示されるたび。各フラグメントのビューは複数の画像アイコンで構成されます。

現在、ユーザーは2本の指で2つのアイコン同時を押すことができます(各フィンガを1つのアイコンで押す)。 このマルチタッチ機能を無効にしたいアプリで許可一度に1つのアイコンを押すだけで有効になります

私は次の方法を試しました:

方法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);
    }

残念ながら、私の解決策はどれも機能しません。それで、-アプリでマルチタッチ機能を無効にするにはどうすればよいですか ??

20
Leem.fin

ケース:複数のボタンがあり、1つのボタンのみを選択する場合。 親で(ROOTではなく、子の親のみ)ボタンのxmlパラメータで追加

Android:splitMotionEvents = "false"

以上です。例:

<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>

ところでレイアウトごとに3つのボタンがある2つのlinearlayoutがある場合、このsplitMotionEventsをその2つのレイアウトに設定する必要がありますおよび親にもその2つのlinearLayoutsの。それ以外の場合は、レイアウトごとに1つのボタンのみをクリックできます(合計= 2)。よろしくお願いします。 :)

他の解決策はどれも私にとってはうまくいかなかった、またはあまりにも不十分でした。

37
deadfish

はい、私はこの問題にも一度直面しましたが、Android:splitMotionEvents = "false"これがレイアウトの子を指示するためにのみ機能するという解決策を見つけました.

2つのレイアウトAとBを作成し、Aに2つのボタンb1、b2がある場合と同様に、Bには2つのボタンb3、b4があります。

aとBの両方が親レイアウトにあるため、最初にこれらのボタンが親レイアウトの直接の子ではないことを確認する必要があります

親レイアウトでは、2つの子AとBしかありません

Android:splitMotionEvents = "false"を親レイアウトに追加した場合よりも、マルチタッチはレイアウトAとレイアウト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"を追加した場合、画面上の2つのボタンを同時にタッチすることはできません。

<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>

参考になると思います。

11
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