2

Talkback と Explore By Touch をサポートする Android アプリを開発していますが、カスタム ビューで 2 本指のスクロールに応答するときに問題が発生しました。

私が理解しているように、画面上で 2 本の指を押したまま移動すると、カスタム ビューの onTouchEvent メソッドで、Talkback/Explore By Touch をオフにして 1 本の指を使用する場合と同じ一連のタッチ イベントが生成されます。

ユーザーが 2 本の指で画面に触れたときに ACTION_DOWN イベントが発生し、続いて一連の ACTION_MOVE イベントが発生し、最後に画面に触れるのをやめたときに ACTION_UP イベントが発生することを期待しています。

これは時々発生しますが、非常に頻繁に、画面に 2 本の指を置くと、正しく解釈するのが難しい一連のイベントが表示されます。

できるだけ多くのコードを割引するために、次のように宣言された単一のカスタム ビューを備えた ADT ウィザードで作成された基本的な Android アプリである単純なサンプル アプリを作成しました。

package com.example.accesseventtest;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class AccessTestView extends View {

    public AccessTestView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        int action_type = event.getActionMasked();

        if (action_type != MotionEvent.ACTION_MOVE)
            Log.d("onTouchEvent", event.toString());

        return true;
    }
}

カスタム ビューは、渡されたすべてのタッチ イベントを消費することを目的としており、これを示すために true を返します。また、生成されるデバッグ ログの量を減らすために、ACTION_MOVE を除くすべてのイベントをデバッグ ログにコピーします。次のレイアウトによってインスタンス化されます。

<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:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.accesseventtest.MainActivity" >

    <com.example.accesseventtest.AccessTestView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        />
</RelativeLayout>

Talkback と Explore By Touch を有効にしてこれを実行し、画面に 2 本の指を置くと、次のように単一の ACTION_DOWN イベントがデバッグ ログに出力されることがあります。

10-06 14:21:41.356: D/onTouchEvent(30151): MotionEvent { action=ACTION_DOWN, id[0]=1, x[0]=828.0, y[0]=744.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=23426762, downTime=23426762, deviceId=4, source=0x1002 }

これは理想的ですが、このシーケンスを発行することがあります。

10-06 14:32:53.026: D/onTouchEvent(30151): MotionEvent { action=ACTION_DOWN, id[0]=1, x[0]=926.0, y[0]=607.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=24098432, downTime=24098444, deviceId=4, source=0x1002 }

10-06 14:32:53.031: D/onTouchEvent(30151): MotionEvent { action=ACTION_CANCEL, id[0]=1, x[0]=1054.0, y[0]=801.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=24098449, downTime=24098444, deviceId=4, source=0x1002 }

10-06 14:32:53.036: D/onTouchEvent(30151): MotionEvent { action=ACTION_DOWN, id[0]=1, x[0]=926.0, y[0]=608.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=24098444, downTime=24098444, deviceId=4, source=0x1002 }

CANCEL の受信時に最初の DOWN アクションを除外できるので、これも問題ではありません。問題が発生するのは、このような大規模な一連のイベントを発行する場合です。

10-06 14:20:47.681: D/onTouchEvent(30151): MotionEvent { action=ACTION_DOWN, id[0]=1, x[0]=697.0, y[0]=933.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=23373092, downTime=23373092, deviceId=4, source=0x1002 }

10-06 14:20:47.731: D/onTouchEvent(30151): MotionEvent { action=ACTION_UP, id[0]=1, x[0]=697.0, y[0]=936.5, toolType[0]=TOOL_TYPE_FINGER, buttonState=0、metaState=0、flags=0x0、edgeFlags=0x0、pointerCount=1、historySize=0、eventTime=23373137、downTime=23373092、deviceId=4、source=0x1002 }

10-06 14:20:47.731: D/onTouchEvent(30151): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=954.0, y[0]=643.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=23373137, downTime=23373137, deviceId=4, source=0x1002 }

10-06 14:20:47.736: D/onTouchEvent(30151): MotionEvent { action=ACTION_POINTER_DOWN(1), id[0]=0, x[0]=954.0, y[0]=643.0, toolType[0] =TOOL_TYPE_FINGER、id[1]=1、x[1]=696.0、y[1]=937.0、toolType[1]=TOOL_TYPE_FINGER、buttonState=0、metaState=0、flags=0x0、edgeFlags=0x0、pointerCount=2 , historySize=0, eventTime=23373137, downTime=23373137, deviceId=4, source=0x1002 }

最初の DOWN、UP、DOWN シーケンスは、上位レベルのコードを混乱させ、クリック イベントとして解釈されます。

Talkback/Explore By Touch を有効にして 2 本指スクロールをサポートするカスタム ビューの実装に成功した人は誰でも、私がこれで間違っている場所に光を当てることができますか?

4

0 に答える 0