问题标签 [motionevent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4258 浏览

android - 多点触控:ACTION_POINTER_DOWN & ACTION_POINTER_UP

我正在尝试使用多点触控作为同时按下两件事的方法。

这是我的代码:

问题是当我触摸屏幕时,服务器正在检索“keydec.down”和“keydec.up”,即使我还没有从触摸屏上移开手指。因此,即使我还没有拉起手指,当我的手指触摸屏幕时,视图TouchHandle也会检测到。有什么想法吗?ACTION_POINTER_DOWNACTION_POINTER_UP

0 投票
1 回答
133 浏览

android - 为什么触摸位置坐标会相互影响?(ACTION_MOVE)

我在这里遇到了一个真正的问题,自过去几个小时以来我一直在拼命想弄清楚。哪儿也去不了...

在编写一个需要处理两个手指在屏幕上的确切位置的应用程序时,我遇到了一个意想不到的行为(对我来说)。经过一些调试,我发现当我将一根手指保持在屏幕上的静态位置,同时用另一根手指在同一屏幕上滑动时,不仅会改变移动手指的坐标,还会改变静态手指的坐标!(虽然不是在现实生活中:D)

这是仅 y 坐标的示例日志输出。
y(0) 是握在屏幕底部的静态手指,
y(1) 从上到下移动。

有趣的是,在我到达屏幕底部之前,y(1) 达到了最大值 480。

有人可以向我解释这种行为吗?

这是我用来生成日志的代码,也许我犯了一个愚蠢的错误......

编辑:在“htc 愿望”上进行了测试。

  • 09-11 17:57:09.257: D/TouchHandler(14932): y(0)=480
  • 09-11 17:57:09.267: D/TouchHandler(14932): y(0)=480 y(1)=5
  • 09-11 17:57:09.287: D/TouchHandler(14932): y(0)=480 y(1)=10
  • 09-11 17:57:09.327: D/TouchHandler(14932): y(0)=480 y(1)=30
  • 09-11 17:57:09.367: D/TouchHandler(14932): y(0)=480 y(1)=70
  • 09-11 17:57:09.427: D/TouchHandler(14932): y(0)=480 y(1)=121
  • 09-11 17:57:09.528: D/TouchHandler(14932): y(0)=480 y(1)=206
  • 09-11 17:57:09.608: D/TouchHandler(14932): y(0)=480 y(1)=271
  • 09-11 17:57:09.618: D/TouchHandler(14932): y(0)=480 y(1)=281
  • 09-11 17:57:09.628: D/TouchHandler(14932): y(0)=447 y(1)=293
  • 09-11 17:57:09.638: D/TouchHandler(14932): y(0)=447 y(1)=304
  • 09-11 17:57:09.658: D/TouchHandler(14932): y(0)=428 y(1)=311
  • 09-11 17:57:09.668: D/TouchHandler(14932): y(0)=419 y(1)=317
  • 09-11 17:57:09.678: D/TouchHandler(14932): y(0)=415 y(1)=325
  • 09-11 17:57:09.688: D/TouchHandler(14932): y(0)=413 y(1)=333
  • 09-11 17:57:09.698: D/TouchHandler(14932): y(0)=411 y(1)=351
  • 09-11 17:57:09.708: D/TouchHandler(14932): y(0)=411 y(1)=363
  • 09-11 17:57:09.718: D/TouchHandler(14932): y(0)=411 y(1)=373
  • 09-11 17:57:09.728: D/TouchHandler(14932): y(0)=411 y(1)=383
  • 09-11 17:57:09.748: D/TouchHandler(14932): y(0)=480 y(1)=480
  • 09-11 17:57:09.758: D/TouchHandler(14932): y(0)=459 y(1)=438
  • 09-11 17:57:09.768: D/TouchHandler(14932): y(0)=459 y(1)=432
  • 09-11 17:57:09.778: D/TouchHandler(14932): y(0)=445 y(1)=431
  • 09-11 17:57:09.788: D/TouchHandler(14932): y(0)=439 y(1)=432
  • 09-11 17:57:09.798: D/TouchHandler(14932): y(0)=437 y(1)=436
  • 09-11 17:57:09.818: D/TouchHandler(14932): y(0)=439 y(1)=441
  • 09-11 17:57:09.828: D/TouchHandler(14932): y(0)=443 y(1)=447
  • 09-11 17:57:09.838: D/TouchHandler(14932): y(0)=450 y(1)=456
  • 09-11 17:57:09.838: D/TouchHandler(14932): y(0)=459 y(1)=467
  • 09-11 17:57:09.858: D/TouchHandler(14932): y(0)=469 y(1)=480
  • 09-11 17:57:09.868: D/TouchHandler(14932): y(0)=476 y(1)=480
  • 09-11 17:57:09.878: D/TouchHandler(14932): y(0)=479 y(1)=480
  • 09-11 17:57:09.888: D/TouchHandler(14932): y(0)=480 y(1)=480
0 投票
2 回答
3156 浏览

android - getPressure 总是返回 1.0

有谁知道为什么getPressure()总是返回1.0

这是我的代码:

0 投票
0 回答
576 浏览

android - 增长视图和 MotionEvent.getX()/MotionEvent.getRawX()

我有以下代码可以扩展磁贴。但是,我有不止一个这些图块,我需要代码对它们中的每个人都是通用的。

启动时的用户界面:http: //s14.postimage.org/9wn8b2my9/Screenshot_2012_09_14_12_03_14.png

我有两个选择:

第一个是使用原始的 X、Y 值,这意味着我的手指在屏幕上的确切位置。这样我可以很容易地计算出几个点的准确宽度、高度和距离。一个问题是该值不适用于所有图块。例如,左上角的图块不会展开,而左下角的图块将扩大到超出应有的水平。唯一真正似乎在听的瓷砖是中间的瓷砖。

瓷砖拒绝拉伸:http ://s12.postimage.org/ltunmbt7x/Screenshot_2012_09_14_12_03_31.png (记录瓷砖已经超出了它的最大边界)

第二个是使用 X、Y 值与父对象的位置进行比较。这个产生更简单的公式,目前持有我的偏好。但是,由于图块恰好扩展,因此值也会扩展。在图块的左上角,值是 (0,0),如果我越过那个角,值将下降到负值。但是,如果我再次收缩瓷砖,我会突然得到一个正值,它会让一切变得摇摇欲坠、有问题、有故障等等。

如果有人能帮我修复这个烦人的错误,我会非常高兴,这样我就可以继续开发这个应用程序。提前致谢!

0 投票
1 回答
1861 浏览

android - 滑动时更改列表视图行背景颜色

我需要实现这样的功能。用户向左滑动列表视图的项目并打开另一个活动。当用户开始向左滑动时,listview 项目的背景颜色应该是绿色,当他完成滑动时,新的 Activity 应该打开并且项目的背景颜色应该变成白色。

我有 SwipeDetector 类来检测我的滑动事件:

以及我如何在我的活动中使用它:

但是当mSwipeDetected = Action.None;在我的 SwipeDetector case MotionEvent.ACTION_UP:语句中注释该行时,Activity 可以正常打开,但是当我返回 Activity 时,listview 项的背景颜色仍然是绿色,并且 Log.i("stop value", "it was stoped");:在我的 Activityelse if语句中无法调用。当我取消注释时, Log.i("stop value", "it was stoped");可以调用它,但是列表视图项的背景颜色仍然是白色,并且新的 Activity 没有打开。我应该如何实施?

0 投票
4 回答
14089 浏览

android - onInterceptTouchEvent,onTouchEvent 只看到 ACTION_DOWN

我有一个顶级 ViewGroup,我称之为 SliderView,我想在其中检测滑动。这主要是有效的,但一个奇怪的失败仍然存在。

SliderView 的本质是覆盖 onInterceptTouchEvent,一旦用户真正滑动,返回“true”以防止其他视图看到 MotionEvent。这是一段代码:

我的理解是我的 SliderView(这是最外层的视图)应该始终接收 onInterceptTouchEvent。在我的一项测试中,顶级子级是 a 但是,在以下情况下,这似乎不是。

当顶级子项是 ScrollView 时,onInterceptTouchEvent 会获取 ACTION_MOVE,并且我的代码会执行我想要的操作。在另一种情况下,顶级子级是 LinearLayout,它有时会失败:它总是获得 ACTION_DOWN 但只有当用户触摸 LinearLayout 内的小部件时才会获得 ACTION_MOVE;如果触摸空白区域,则只有 ACTION_DOWN 通过。

我会注意到它的行为就好像失败案例触摸发生在 SliderView 之外。但是,如果是这样,我为什么会收到 ACTION_DOWN 事件?

第二个注意事项:查看 ScrollView 的源代码,我看到它正在检查“inChild”;我还没有弄清楚那是什么以及它可能是如何相关的。

0 投票
2 回答
3527 浏览

java - 避免在 Android 中合并 ACTION_MOVE MotionEvents

我试图准确地从AndroidACTION_MOVE中的 s 序列中读取增量。MotionEvent

然而,我用手指在屏幕上滑动的测试表明,在最初的 s 之后ACTION_DOWN,几个MotionEvents 没有传递给听众。只有在进行了足够大的移动之后,ACTION_MOVE才会以相对较大的增量传递事件。在这第一个ACTION_MOVE事件之后,所有增量都再次变得非常小。

或者,也可以触摸屏幕 ( ACTION_DOWN) 并稍微移动一下,根本不会ACTION_MOVE传递任何事件。

我知道对于许多用途,具有一定的移动(内)敏感性是有益的。但是,有没有办法避免ACTION_MOVE事件合并,使得每一个小的初始动作都被传递?ACTION_DOWN是否可以在位置和第一个位置之间的最小距离上设置阈值ACTION_MOVE

这是一些示例代码:

以及相应的输出:

换句话说,我想避免第二行(-16/-9)的大增量,但接收 1 或 2 的增量...

我在三星 Galaxy S2 和 Note 上进行了测试。

任何帮助或建议都非常感谢!

0 投票
2 回答
3485 浏览

android - 如何区分 MotionEvent.ACTION_UP 和在 Android 中将手指拖出屏幕?

我的应用程序是一个边到边的按钮网格。我正在覆盖所有触摸和运动事件并手动控制行为。一切正常,除了手指被拖出屏幕外。MotionEvent.ACTION_UP 被触发,我不希望这样。我尝试使用 getRawX() 和 getRawY() 来确定(例如,对于顶部和左侧边缘)坐标是否 < 1,但如果快速拖动手指,该值会更高(高达 20)。当 ACTION_UP 被触发时,位置值似乎有点滞后。有没有解决的办法?ACTION_CANCEL 似乎根本没有被触发。

0 投票
2 回答
13933 浏览

android - Android 中 ScrollView 中的 MotionEvent 处理

我一直试图弄清楚 Android 中 ScrollViews 中 MotionEvents 的行为,但有些东西我无法弄清楚。

作为一个例子,我制作了一个 Activity,里面有一个 ScrollView,而 ScrollView 里面有一个 LinearLayout。我实现了自己的类来控制与触摸相关的功能:

当我单击屏幕上的任意位置时,我会收到以下日志:

这意味着触摸事件没有进入滚动视图内的内部布局。但是,当我将 ScrollView 更改为 LinearLayout 时(只需在扩展中更改它),事件就会下降到内部布局:

我查看了 ScrollView 类的源代码,它覆盖的唯一与触摸相关的方法是我自己覆盖的方法。所以我不明白 LinearLayout 和 ScrollView 的行为有什么区别。

0 投票
4 回答
1491 浏览

android - Android MotionEvent 触摸位置的奇怪跳跃

我使用类似于以下的代码在 Android 上实现了一个简单的可滚动画廊类型视图:

它有效,但我注意到有时它会突然“跳跃”一点。只有当您滚动到一端时,它才会真正引人注目。如果您已经一直向右滚动,并且您的手指总是向右移动,则有时该事物会向左跳一帧。

我在上面添加了日志记录行并获得了这个输出(为便于阅读而编辑):

请注意,它会跳跃 10 个像素!我发誓我只是将手指向右拖动,并且非常慎重。起初我认为 Android 可能会乱序传递事件或其他什么,但事件时间是单调的。

知道为什么会这样吗?我想这可能是三星的错(我有 Galaxy S2)。它确实一个延迟驱动程序强加的触摸阈值,因此编写输入驱动程序的人显然不知道他们在做什么。尽管如此,10 像素似乎是一个很大的飞跃。有时它甚至更大!