我是Android开发的新手,正在为盲人开展可访问性研究项目(Jelly Bean API 17级项目)。我一直在尝试一些手势,并且双指拖动手势实施起来非常困难。以下图片捕获了我实际需要的内容。
我希望盲人用户将两根手指水平拖动(屏幕上的任何位置),并且他将获得他/她在EditText中输入的文本的音频输出。另外,根据两个手指在拖动时移动的距离,我们分别输出每个单词。(例如下面)
我偶然发现它似乎检测到双指触摸:示例:如果用户键入“今天是美好的一天”并拖动他的手指 (x值)通过(比方说)10个单位到左边我们输出“美好的一天”但是如果他 拖动它说20个单位到左边我们输出“美好的一天”,30个单位 离开“是美好的一天”等等。
TouchEvent(MotionEvent event)
此detecting multiple touches上的教程似乎很有希望,但我需要它才能用于触摸和拖动,我不确定是否可以像这样实现。
任何实现此建议的新建议或指向可以提供帮助的教程都会很棒!
提前致谢, 硐
答案 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时才注意拖动。