- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个应用程序,该应用程序涉及使用手指或手写笔在屏幕上书写。我有那部分工作。在 ACTION_DOWN 上,开始绘制;在 ACTION_MOVE 上,添加线段;在 ACTION_UP 上,完成行。
问题是在 ACTION_DOWN 之后,指针显然需要从它开始的地方 move 超过 10 个像素(基本上是起点周围的 20x20 框)才能开始发送 ACTION_MOVE 事件。离开盒子后, move 事件都非常准确。 (我通过测试找出了 10 像素的东西。)因为这是用来写字或画画的,所以 10 像素是一个相当大的损失:取决于你想写的有多小,你可能会丢失第一个字母或两个。我还没有找到任何关于它的信息——只有一两个论坛上的几个帖子,比如 http://android.modaco.com/topic/339694-touch-input-problem-not-detecting-very-small-movements/page_pid_1701028#entry1701028 .它似乎存在于某些设备或系统上,而不存在于其他设备或系统上。但是,不知道如何在拥有它时摆脱它。
我使用的是搭载 Android 3.1 的 Galaxy Tab 10.1。我尝试了几种不同的方法来尝试摆脱它:我尝试将事件的坐标设置为其他东西,看看我是否可以欺骗它认为光标在不同的地方;我尝试在更改坐标的情况下重新分派(dispatch)事件(我的处理程序对新点使用react,但仍然没有响应 10 像素半径内的 move 。)我在源代码中搜索了任何对该效果的引用,并没有发现(虽然我认为它来自不同版本的 Android - 3.1 的代码尚未发布,是吗?)我已经搜索了查询指针当前状态的方法,所以我可以有一个计时器捕捉变化,直到指针越过阈值。没有相应的 move 事件,找不到任何获取指针坐标的方法。没有任何效果。有人对此一无所知,或者有任何想法或解决方法吗?谢谢。
-- 更新:拖放事件显示相同的阈值。
最佳答案
我部分同意@passsy 的帖子,但得出不同的结论。首先如前所述,mTouchSlop
是我们感兴趣的值,它通过 ViewConfiguration.get(context).getScaledTouchSlop();
如果您检查 ViewConfiguraton 的 Android 源代码,TOUCH_SLOP 的默认值为 8dip,但评论中提到此值只是一个后备值,实际值是在该特定设备的 Android 操作系统是建成。 (它可能大于或小于该值。它似乎适用于 Galaxy Tab 设备)
更具体的代码示例,mTouchSlop
值是在 View
初始化时从 ViewConfiguration
中读取的,但该值仅在 onTouchEvent
方法中访问。如果您扩展 View
并覆盖此方法(不调用 super
),则 View
类中的 mTouchSlop
的行为不再相关。
(对我们来说)更能说明问题的是,当更改 Android 设置以在屏幕上覆盖触摸事件时,带有小拖动的触摸不会注册为运动事件,Android 操作系统的十字准线确实如此不动。由此我们得出的结论是,最小拖动距离 是在操作系统级别强制执行的,您的应用程序永远不会知道小于 TOUCH_SLOP 值的拖动事件。您还应注意,不应直接使用 TOUCH_SLOP 并且 API 弃用了 getTouchSlop
方法并推荐采用设备屏幕尺寸的 getScaledTouchSlop
像素密度考虑在内。这样做的副作用是在不同设备上感知的实际最小行程长度可能会有所不同。例如,在 Galaxy Tab 2.0 7.0"上感觉我们能够使用与在 Galaxy Tab 2.0 10.1"上运行时相同的代码库绘制更短的最小笔划
您还应注意(如果您找到改变此值的方法),此值决定了 Android 系统如何区分轻击和敲击。也就是说,如果您点击屏幕但手指在执行点击时有轻微 move ,如果 move 小于 TOUCH_SLOP 将被解释为点击,但如果 move 超过 则将被解释为敲击TOUCH_SLOP。因此,将 TOUCH_SLOP 设置为较小的值会增加点击被解释为笔划的可能性。
我们自己的结论是,这个最小距离在实践中是无法改变的,是我们需要忍受的。
关于Android ACTION_MOVE 阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6785068/
我想创建带有滚动内容的 CardStackView,但在使用 NestedScrollView 和 onTouchListener 时遇到一些问题。 我正在使用 CardStackView,我想在 C
尽管我是 Android 的新手,但我感觉比以往任何时候都更菜鸟。我有扩展 SurfaceView 的 View ,我在那里覆盖了 onTouchEvent 并将此测试代码放入其中: if (even
我正在编写一个应用程序,该应用程序涉及使用手指或手写笔在屏幕上书写。我有那部分工作。在 ACTION_DOWN 上,开始绘制;在 ACTION_MOVE 上,添加线段;在 ACTION_UP 上,完成
我有以下代码 fragment (来自此聊天头 tutorial ),最后一个 switch case 的要点是处理 View 上的拖动,但是我无法不理解这个逻辑是如何运作的: ...
我在 opengl ES 中制作了一个带有叠加层的按钮,例如谷歌地图;我希望我的按钮在点击时显示叠加层,并在再次点击按钮时将其关闭。问题是,如果用户点击按钮并在图像周围拖动,那么叠加层仍然会关闭。有没
我编写了一个代码来在拖动按钮时移动它。我正在根据当前鼠标坐标更新按钮 X 和 Y 坐标,但是当我拖动按钮时,鼠标坐标值在低值和高值之间切换,即使我拖动得非常慢也是如此。 当我记录坐标时,值显示为: (
我正在尝试创建一个可拖动 View ,并根据从拖动 View 到放置目标 View 的距离更改放置目标 View 的 alpha。为此,我需要一种方法来持续检查拖动 View 的当前位置。我试图使用
我让 SimpleOnGestureListener 使用 MotionEvent 捕获 onLongPress,但问题是我无法读取事件位移,因为我总是收到 ACTION_DOWN 代码。如何实现?我
我发现当 CPU 达到极限时,我的动态壁纸似乎没有收到 ACTION_MOVE 事件。但是,它仍然接收 ACTION_DOWN 和 ACTION_UP 事件。 我已经建立了一个最小的 eclipse
我正在编写一个游戏,当我触摸屏幕时,一个球会跟随我的移动。我的触摸代码类似于: ... case MotionEvent.ACTION_MOVE: ballX = currentX; ballY =
我正在尝试让我绘制的所有 Sprites 都可以拖动到一个小游戏中。它应该能够触摸到任何地方, Sprite 应该移动相同的距离,手指移动。 使用以下方法,他们将在 ACTION_MOVE 事件上移动
根据 android MotionEvent 文档:在按下手势期间发生了变化(在 ACTION_DOWN 和 ACTION_UP 之间)。该运动包含最近的点,以及自上次向下或移动事件以来的任何中间点。
我有一个覆盖了 onInterceptTouchEvent() 的自定义 ViewGroup。它收到 ACTION_DOWN 但从未收到 ACTION_MOVE。据我了解,除非它返回“true”,否则
我想做一个简单的控件:一个里面有 View 的容器。如果我触摸容器并移动手指,我想移动 View 以跟随我的手指。 我应该使用哪种容器(布局)?如何做到这一点? 我不需要使用表面,而是使用简单的布局。
这是我想要的: 触摸屏幕。 继续移动手指。 如果您在移动手指的同时触摸屏幕上的任何按钮,按钮的颜色按钮的颜色变为绿色。 问题:“if”条件在第 57 行 (.java) 中不起作用 if (motio
您好,在我的应用程序中,我希望上半部分的手指可以控制顶部的东西,下半部分的手指可以同时控制底部的东西。所以我尝试实现多点触控,但我似乎无法正确设置 ACTION_MOVE。当我在屏幕上移动 2 个手指
我正在通过触摸事件围绕圆圈移动图像。我希望用户触摸图像,当用户围绕圆圈拖动该图像时,它会移动,否则不会移动。 有人可以帮忙计算一下如何检查手指是否沿着圆圈移动并相应地移动图像。 谢谢。 更新: 我正在
在 Recycler View 中左右滑动列表项时,两者中哪一个更适合使用?目前我的代码位于 MotionEvent.Action_move 中,我无法弄清楚很多事情。 运动一点也不流畅。非常波涛汹涌
我想在 ACTION_MOVE 的触摸事件上缩放 View 。 所有位图都是正方形格式。 (point1=上+左,point2=上+右,point3=下+左,point4=下+右)我得到了全部四分。当
我有一个键盘 View ,当手指离开键盘 View 时,我需要跟踪 ACTION_MOVE。问题是,一旦它超出范围,它就会停止报告正确的 Y 值,并在我的手指位于键盘 View 上方时继续报告最后一个
我是一名优秀的程序员,十分优秀!