如何在安卓系统上实现"双指拖动"手势?

14

我是Android开发新手,正在为盲人(Jelly Bean API 17项目)开展无障碍研究项目。我一直在尝试一些手势,但实现双指拖动手势非常困难。以下图片很好地捕捉了我所需要的东西。

drag gesture

我希望盲人用户用两个手指在屏幕上水平拖动,然后他/她可以获得EditText中输入文本的音频输出。根据两个手指拖动的距离,我们将分别输出每个单词。 (下面是示例)

例如:如果用户键入"今天是个好日子"并向左拖动手指(x值)10个单位,我们会输出"好日子",但是如果他向左拖动20个单位,则会输出"一个好日子",向左拖动30个单位则会输出"是个好日子"等等。

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

TouchEvent(MotionEvent event)

此外,这篇关于检测多点触控的教程看起来很有前途,但我不确定它能否像这样实现触摸拖动

如果有任何新的建议来实现这一点,或者可以帮助的教程指针,将会很棒!

提前致谢, Adit


你好 @Adit.. 你能分享一下Play商店的链接吗? - Prabs
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;
    }
}

看到了吧!"双指拖动"手势终于实现了。似乎我也可以写一篇小博客!!:)


请问您能否检查一下这个问题 - Prabs
为什么你不使用 actionIndex? - fins

4
我不知道现在回答这个老问题是否相关,但我已经开发了一个,用于在Android上支持基本的一指和二指手势,并提供非常简单易用的功能。
大多数手势可以像这样轻松设置:
view.setOn2FingerGestureListener ( new On2FingerGestureListener () {
@Override 
onSwipeup() {
}
onSwipedown() {
}
});

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

从@Arnav的另一个答案中得知,该库在这里:http://github.com/championswimmer/SimpleFingerGestures_Android_Library。 - Stan Kurdziel

3

触摸拖动是一系列事件。首先是按下,然后是1个或多个移动,最后是抬起。在按下时检测起始点,然后在移动时进行拖动。在抬起时停止拖动。

要进行两个手指的拖动,请仅关注拖动事件,如果 MotionEvent.getPointerCount() == 2


2
检测用户首次触摸(按下事件)的点。存储它。在移动事件上,检查是否有2个手指按下。如果是这样,请通过从下方减去该点来检查其移动了多远。滚动那么多。 - Gabe Sechan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接