如何在Android上实现"双指拖动"手势?

Adi*_*pta 12 android android-layout android-gesture

我是Android开发的新手,正在为盲人开展一个无障碍研究项目(Jelly Bean API 17级项目).我一直在试验一些手势,而且双指拖动手势实施起来非常困难.以下图片捕获了我实际需要的内容.

拖动手势

我希望盲人用户将两根手指水平拖动(屏幕上的任何位置),然后他将获得他/她在EditText中输入的文本的音频输出.同时根据两个手指在拖动时的距离,我们分别输出每个单词.(例如下面的例子)

示例:如果用户键入"今天是美好的一天"并将他的手指(x值)拖动(比方说)10个单位到左边我们输出"美好的一天"但是如果他拖动它说20个单位到左边我们输出"好"一天",对于30个单位到左"是一个美好的一天"等等.

我偶然发现它似乎检测到双指触摸:

TouchEvent(MotionEvent event)
Run Code Online (Sandbox Code Playgroud)

另外这个关于检测多个触摸的教程看起来很有希望,但是我需要它来处理触摸拖动,我不确定是否可以像这样实现.

任何新的建议来实现这个或指向可以帮助的教程将是伟大的!

在此先感谢,Adit

Adi*_*pta 21

好的,感谢Gabe在这里以及关于此的众多博客,我找到了解决问题的方法!

首先,我在"Activity"类中初始化了我的变量

int GLOBAL_TOUCH_POSITION_X = 0;
int GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
Run Code Online (Sandbox Code Playgroud)

接下来,在onCreate()内:

//Two-Finger Drag Gesture detection
    RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView);
    TextLoggerLayout.setOnTouchListener(
            new RelativeLayout.OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent m) {
                    handleTouch(m); 
                    return true;
                }

    });
Run Code Online (Sandbox Code Playgroud)

现在按如下方式定义函数handleTouch(m),它输出"双指触摸"的当前位置以及触摸的初始位置:

void handleTouch(MotionEvent m){
    //Number of touches
    int pointerCount = m.getPointerCount();
    if(pointerCount == 2){
        int action = m.getActionMasked();
        int actionIndex = m.getActionIndex();
        String actionString;
        TextView tv = (TextView) findViewById(R.id.testDiffText);
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:                   
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            case MotionEvent.ACTION_UP:                 
                GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
                actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);  
                break;  
            case MotionEvent.ACTION_MOVE:
                GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1);
                int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X;
                actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);                   
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            default:
                actionString = "";
        }

        pointerCount = 0;
    }
    else {
        GLOBAL_TOUCH_POSITION_X = 0;
        GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

你有它!"双指拖动"手势终于实现了.看起来,就像我可以在它上面写一篇小博文!:)