【问题标题】:How to implement a "Two Finger Drag" gesture on Android?如何在 Android 上实现“两指拖动”手势?
【发布时间】:2013-02-11 18:30:57
【问题描述】:

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

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

示例:如果用户输入“今天是个好日子”并拖动手指 (x value) by (say) 10 units to Left 我们输出 "good day" 但如果他 将它拖到左侧说 20 个单位,我们输出 “美好的一天”,表示 30 个单位 向左“是美好的一天”等等。

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

TouchEvent(MotionEvent event)

此外,detecting multiple touches 上的本教程似乎很有希望,但我需要它适用于 touchdrag,我不确定是否可以这样实现。 p>

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

提前致谢, 修改

【问题讨论】:

  • 你好@Adit..你能分享一下Playstore链接吗

标签: android android-layout android-gesture


【解决方案1】:

好的,感谢 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;
    }
}

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

【讨论】:

  • 你能检查一下this question
  • 为什么不使用actionIndex?
【解决方案2】:

我不知道现在添加答案对这么老的问题有多大意义,但我一直在开发 a library 以支持 Android 上的基本 1 和 2 手指手势,功能非常简单。

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

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

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

【讨论】:

【解决方案3】:

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

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

【讨论】:

  • 检测用户第一次触摸的点(向下事件)。存储它。在移动事件中,检查是否有 2 个手指向下。如果是这样,通过从下减去该点来检查它移动了多远。滚动那么多。
猜你喜欢
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多