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

时间:2013-02-11 18:30:58

标签: android android-layout android-gesture

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

drag gesture

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

  

示例:如果用户键入“今天是美好的一天”并拖动他的手指   (x值)通过(比方说)10个单位到左边我们输出“美好的一天”但是如果他   拖动它说20个单位到左边我们输出“美好的一天”,30个单位   离开“是美好的一天”等等。

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

TouchEvent(MotionEvent event)

detecting multiple touches上的教程似乎很有希望,但我需要它才能用于触摸拖动,我不确定是否可以像这样实现。

任何实现此建议的新建议或指向可以提供帮助的教程都会很棒!

提前致谢, 硐

3 个答案:

答案 0 :(得分:18)

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

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

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

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

答案 1 :(得分:4)

我不知道现在添加答案的相关性是多么相关,但是我一直在开发a library以支持Android上的基本1和2手指手势,非常简单的下降功能。

大多数手势都可以像

一样轻松设置
view.setOn2FingerGestureListener ( new On2FingerGestureListener () {
@Override 
onSwipeup() {
}
onSwipedown() {
}
});

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

答案 2 :(得分:2)

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

要进行2指拖动,只有在MotionEvent.getPointerCount()== 2时才注意拖动。