问题标签 [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.
android - 多点触控:ACTION_POINTER_DOWN & ACTION_POINTER_UP
我正在尝试使用多点触控作为同时按下两件事的方法。
这是我的代码:
问题是当我触摸屏幕时,服务器正在检索“keydec.down”和“keydec.up”,即使我还没有从触摸屏上移开手指。因此,即使我还没有拉起手指,当我的手指触摸屏幕时,视图TouchHandle
也会检测到。有什么想法吗?ACTION_POINTER_DOWN
ACTION_POINTER_UP
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
android - getPressure 总是返回 1.0
有谁知道为什么getPressure()
总是返回1.0
?
这是我的代码:
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),如果我越过那个角,值将下降到负值。但是,如果我再次收缩瓷砖,我会突然得到一个正值,它会让一切变得摇摇欲坠、有问题、有故障等等。
如果有人能帮我修复这个烦人的错误,我会非常高兴,这样我就可以继续开发这个应用程序。提前致谢!
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 没有打开。我应该如何实施?
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”;我还没有弄清楚那是什么以及它可能是如何相关的。
java - 避免在 Android 中合并 ACTION_MOVE MotionEvents
我试图准确地从AndroidACTION_MOVE
中的 s 序列中读取增量。MotionEvent
然而,我用手指在屏幕上滑动的测试表明,在最初的 s 之后ACTION_DOWN
,几个MotionEvent
s 没有传递给听众。只有在进行了足够大的移动之后,ACTION_MOVE
才会以相对较大的增量传递事件。在这第一个ACTION_MOVE
事件之后,所有增量都再次变得非常小。
或者,也可以触摸屏幕 ( ACTION_DOWN
) 并稍微移动一下,根本不会ACTION_MOVE
传递任何事件。
我知道对于许多用途,具有一定的移动(内)敏感性是有益的。但是,有没有办法避免ACTION_MOVE
事件合并,使得每一个小的初始动作都被传递?ACTION_DOWN
是否可以在位置和第一个位置之间的最小距离上设置阈值ACTION_MOVE
?
这是一些示例代码:
以及相应的输出:
换句话说,我想避免第二行(-16/-9)的大增量,但接收 1 或 2 的增量...
我在三星 Galaxy S2 和 Note 上进行了测试。
任何帮助或建议都非常感谢!
android - 如何区分 MotionEvent.ACTION_UP 和在 Android 中将手指拖出屏幕?
我的应用程序是一个边到边的按钮网格。我正在覆盖所有触摸和运动事件并手动控制行为。一切正常,除了手指被拖出屏幕外。MotionEvent.ACTION_UP 被触发,我不希望这样。我尝试使用 getRawX() 和 getRawY() 来确定(例如,对于顶部和左侧边缘)坐标是否 < 1,但如果快速拖动手指,该值会更高(高达 20)。当 ACTION_UP 被触发时,位置值似乎有点滞后。有没有解决的办法?ACTION_CANCEL 似乎根本没有被触发。
android - Android 中 ScrollView 中的 MotionEvent 处理
我一直试图弄清楚 Android 中 ScrollViews 中 MotionEvents 的行为,但有些东西我无法弄清楚。
作为一个例子,我制作了一个 Activity,里面有一个 ScrollView,而 ScrollView 里面有一个 LinearLayout。我实现了自己的类来控制与触摸相关的功能:
当我单击屏幕上的任意位置时,我会收到以下日志:
这意味着触摸事件没有进入滚动视图内的内部布局。但是,当我将 ScrollView 更改为 LinearLayout 时(只需在扩展中更改它),事件就会下降到内部布局:
我查看了 ScrollView 类的源代码,它覆盖的唯一与触摸相关的方法是我自己覆盖的方法。所以我不明白 LinearLayout 和 ScrollView 的行为有什么区别。
android - Android MotionEvent 触摸位置的奇怪跳跃
我使用类似于以下的代码在 Android 上实现了一个简单的可滚动画廊类型视图:
它有效,但我注意到有时它会突然“跳跃”一点。只有当您滚动到一端时,它才会真正引人注目。如果您已经一直向右滚动,并且您的手指总是向右移动,则有时该事物会向左跳一帧。
我在上面添加了日志记录行并获得了这个输出(为便于阅读而编辑):
请注意,它会跳跃 10 个像素!我发誓我只是将手指向右拖动,并且非常慎重。起初我认为 Android 可能会乱序传递事件或其他什么,但事件时间是单调的。
知道为什么会这样吗?我想这可能是三星的错(我有 Galaxy S2)。它确实有一个延迟驱动程序强加的触摸阈值,因此编写输入驱动程序的人显然不知道他们在做什么。尽管如此,10 像素似乎是一个很大的飞跃。有时它甚至更大!