草庐IT

Android ACTION_MOVE 阈值

coder 2023-11-19 原文

我正在编写一个应用程序,该应用程序涉及使用手指或手写笔在屏幕上书写。我有那部分工作。在 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/

有关Android ACTION_MOVE 阈值的更多相关文章

  1. ruby - 在 ruby​​ Selenium 中移动鼠标(move_to) - 2

    我正在尝试使用Ruby中的SeleniumWebDriver2.4模拟鼠标移动如果我运行测试,是否应该看到鼠标在我的屏幕上移动?我很困惑。我试过很多不同的方法示例代码:require'selenium-webdriver'driver=Selenium::WebDriver.for:firefoxdriver.navigate.to'http://www.google.com'element=driver.find_element(:id,'gbqfba')那我试过了driver.action.move_to(element).performdriver.mouse.move_to(e

  2. 深入理解C++中的move和forward! - 2

    导语 |  在C++11标准之前,C++中默认的传值类型均为Copy语义,即:不论是指针类型还是值类型,都将会在进行函数调用时被完整的复制一份!对于非指针而言,开销及其巨大!因此在C++11以后,引入了右值和Move语义,极大地提高了效率。本文介绍了在此场景下两个常用的标准库函数:move和forward。一、特性背景(一)Copy语义简述C++中默认为Copy语义,因此存在大量开销。以下面的代码为例:0_copy_semantics.cc#include#includeclassObject{public:Object(){std::coutv;v.push_back(obj);}最终的输出

  3. javascript如何在滚动路线上 move 元素 - 2

    我有一条像垂直蛇一样的路线。(像这样http://www.my-favorite-coloring.net/Images/Large/Animals-Reptiles-Snake-31371.png)我如何通过滚动的X和Y位置move路径上的元素(圆10x10)?水平没问题:varcoin=$('#coin');$(window).scroll(function(){varcoinTop=coin.css('top'),cointLeft=coin.css('left');if($(window).scrollTop()>100&&$(window).scrollTop()但是我如何沿

  4. javascript - 如何在 plotly js 中创建水平阈值线? - 2

    我正在使用plotlyJS创建一个简单的折线图。代码如下:vartrace1={x:[1,2,3,4],y:[10,15,13,17],type:'scatter'};varlayout={xaxis:{title:"X-Axis",tickangle:45,rangemode:'nonnegative',autorange:true,exponentformat:"none"},yaxis:{title:"Time",tickangle:45,rangemode:'nonnegative',autorange:false}}Plotly.newPlot(myDiv,[trace1],

  5. javascript - Greybox : Can't move focus to the control because it is invisible, 未启用,或者是不接受焦点的类型 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:JavaScript:VisibilityerrorinInternetExplorerwhensettingfocusonaninputelement我有一个在灰框中加载的页面。我使用document.getElementById("textfield").focus()设置焦点-这在直接调用页面时效果很好。但是当在灰盒中加载时,将焦点设置在onload()事件上会返回:Can'tmovefocustothecontrolbecauseitisinvisible,notenabled,orofatypeth

  6. javascript - 谷歌图表 : Move legend position - 2

    我正在使用Google图表可视化我网站上的数据。我对“可视化”1.1和“pakcages”行有疑问:google.load('visualization','1.1',{packages:['line']});我尝试将图例列放在底部位置,与其他GoogleCharts类型一起使用下一行并且它有效:varoptions={legend:{position:'bottom'}};但是对于这种类型的图表不起作用,它将图例列放在右侧,就像您在我的网站的这张图片中看到的那样:chartexample谢谢! 最佳答案 我相信语法是这样的:var

  7. javascript - 如何在js中更改 "touchmove"的阈值 - 2

    我只想问有没有办法改变touchmove事件的阈值?在我的PhoneGap应用程序中,将出现一个图像。如果touchstart被触发,另一个图像将出现。如果touchend或touchmove被触发,所有图像都必须消失。这是我的代码:$('.greenApple').on('touchend',function(e){$('body').find('.active').removeClass('active');$('body').find('.greenApple').addClass('hidden');flag=true;return;});$('.greenApple').on

  8. javascript - 我可以根据 Chart.js 中的给定阈值设置不同的填充颜色吗? - 2

    在Chart.js(Chart.js)中,是否可以为高于或低于给定阈值的值使用不同的填充颜色?我在Chart.js中找不到执行此操作的任何选项,以前有人做过类似的事情吗?我更喜欢使用Chart.js而不是Highcharts。像这样:Highchartsexamplehtmljs$(function(){$('#container').highcharts({chart:{type:'area'},xAxis:{categories:['Jan','Feb','Mar','Apr','May','Jun']},yAxis:{title:{text:'$'}},title:{text:'

  9. javascript - Photoshop 脚本 : Move an image to position x, y - 2

    我有一个事件的ArtLayer被变量NewLayer引用,我想移动到Canvas中的绝对位置x,y。我已经用谷歌搜索了几个小时,但没有任何结果。有人可以举个例子吗?//谢谢。 最佳答案 经过更多API阅读和搜索后,我得出的结论是只能使用增量移动来移动图层。我编写了这个小函数来将图层定位在绝对位置。希望这对下一个有同样问题的读者有所帮助...//******************************************//MOVELAYERTO//Author:MaxKielland////MoveslayerfLayert

  10. javascript - jQuery UI 可排序 : Move clone but keep original - 2

    现在我有一列元素,我将它拖到我拖动的位置,它会克隆,但当我放下时,它也会删除原始元素。$(".column").sortable({helper:'clone',connectWith:".column",connectWith:".grid",start:function(e,ui){ui.placeholder.height(ui.item.height());$(".column").find('.portlet:hidden').show()console.log('started')},stop:function(event,ui){$(ui.helper).clone(tr

随机推荐