14

我是 Android 开发的新手,正在为盲人开展无障碍研究项目(Jelly Bean API 级别 17 项目)。我一直在尝试一些手势,而两指拖动手势真的很难实现。下图很好地捕捉到了我真正需要的东西。

拖动手势

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

示例:如果用户输入“今天是美好的一天”并将他的手指(x 值)向左拖动(例如)10 个单位,我们输出“美好的一天”,但如果他将手指向左拖动 20 个单位,我们将输出“美好的一天”天”,左 30 个单位“是美好的一天”等。

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

TouchEvent(MotionEvent event)

此外,关于检测多次触摸的本教程似乎很有希望,但我需要它来处理触摸拖动,我不确定是否可以像这样实现。

任何实现这一点的新建议或可以提供帮助的教程的指针都会很棒!

在此先感谢,阿迪特

4

3 回答 3

22

好的,多亏了这里的 Gabe 和许多关于此的博客,我找到了解决问题的方法!

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

int GLOBAL_TOUCH_POSITION_X = 0;
int GLOBAL_TOUCH_CURRENT_POSITION_X = 0;

接下来,在 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;
                }

    });

现在定义函数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;
    }
}

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

于 2013-02-14T11:36:09.463 回答
4

我不知道现在添加一个答案对于这样一个老问题有多重要,但我一直在开发一个库来支持 Android 上的基本 1 和 2 手指手势,功能非常简单。

大多数手势都可以轻松设置

view.setOn2FingerGestureListener ( new On2FingerGestureListener () {
@Override 
onSwipeup() {
}
onSwipedown() {
}
});

它是开源的,也可以作为 .jar 下载

于 2014-04-13T20:59:22.690 回答
3

触摸和拖动是一系列事件。首先你有一个下降,然后你有一个或多个动作,然后你有一个上升。您在向下检测到一个起点,然后在移动中发生拖动。阻力在上升时停止。

要进行 2 指拖动,请仅注意拖动 if MotionEvent.getPointerCount() == 2

于 2013-02-11T18:51:04.960 回答