如何增加一定比例的触摸面积?

时间:2014-10-25 17:16:54

标签: java android touch area

我一直在尝试开发这款游戏,用户必须点击图片上的某些点。我一直根据像素位置存储这些点。通过获取onTouch事件中的X和Y坐标,我可以轻松地按下像素。但是我面临的问题是每次都难以按下像素的确切位置(因此,为了测试目的,我在所有4个方向上设置了40 px的容差)。那么有没有一种方法可以设置某种容差,可以从设置菜单进行调整,以便人们可以轻松地使用不同手指尺寸的人,并从不同的屏幕尺寸播放?感谢您的任何帮助或建议

tolerance = 40
public boolean onTouchEvent(MotionEvent event) {
    // MotionEvent object holds X-Y values
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        int XCood = (int) event.getX();
        int YCood = (int) event.getY();
        int XMin = ActXCod[index] - tolerance, 
            XMax = ActXCod[index] + tolerance, 
            YMin = ActYCod[index] - tolerance, 
            YMax = ActYCod[index] + tolerance;
        if (index < (limit - 1)) // loop to check number of images
        {
            if(XCood > XMin && XCood < XMax && YCood > YMin && YCood < YMax){
            //Do stuff
        }}}

这里XMin和XMax是X坐标的最小和最大范围,Ymin和Ymax是Y坐标的最小和最大范围。
XCood和YCood是用户触摸的a和y坐标。

3 个答案:

答案 0 :(得分:3)

我建议你看一下TouchDelegate,如果我的问题正确,它应该是你需要的。从设置中获得容差后,您可以计算适当的像素数量,以正确调整委托的大小。

http://developer.android.com/training/gestures/viewgroup.html#delegate

还有更多信息和示例代码

快乐的编码!

答案 1 :(得分:1)

users have to click certain points on a image告诉我,除了putting invisible/transparent buttons over the image之外,每个人都有自己的事件处理功能,您已经选择将图像发送到一个地方并且正在进行决定哪些点击符合目标。

enter image description here(a)中 enter image description here(b)中 enter image description here(c)中

这意味着,如果您的图片看起来像(a)您设置了点(像素位置),如(b):

这可以理解地引起你的问题,因为人类很难击中那些小目标。

你已经决定解决这个问题的方法是给人类更胖的手指,并试图校准制造脂肪的方法。让我们试一下用户试图拨打1238的用例。在(c)中,当他们走的时候我会增加手指的大小。由于8号印刷机覆盖了8和0的点,我说它太大了。

enter image description here(d) enter image description here(e)中 enter image description here(F)

(d)显示了用这种方法校准的合理尺寸。请注意,1和3仍然错过。 1是一个错过,因为这些按钮不是方形的。这是这种胖指方法的局限性。 3是一个未命中因为人实际上错过了按钮之间的命中。如果你坚持认为3应该算上,我不知道我们如何在没有2,5和&amp ;;的情况下做到这一点。 6计数。如果那是你想要的,我们需要矩形碰撞检测。稍后会详细介绍。

假设3应被视为未命中,我希望您考虑(d)在数学上与(e)相同。仅通过向目标点添加公差而不是用户手指就可以实现这一点。 1和3仍然是未命中但现在不是关心校准用户手指的肥胖,我们只关心目标有多大。

简单地以这种方式思考就可以让我们自由地处理我们的目标不是正方形的事实。他们是长方形。在(f)中这样做可以修复错过的1。如果你的目标是相同的大小和比例,你不需要处理使用不同的x和y容差。如果您希望能够灵活地更改大小,以便正确处理该绿色按钮,则可以将目标建模为单点。使用android.graphics.Rect为它们建模。实际上,我更喜欢你用他们自己的类android.graphics.Rect对它们进行建模,但这是一个OOP肥皂盒,我会在其他时间爬上去。

假设您已在某个位置使用new Rect(left, top, right, bottom)]定义目标并将其分配给Rect r;,您现在可以使用r.contains( (int) event.getX(), (int) event.getY() );检测到匹配 既然我们已经在OOP众神中嗤之以鼻,并且拒绝按钮的想法,我会说每次点击都会循环通过所有目标测试包含()。

enter image description here(G)

现在,如果您真的坚持在用户未命中3时全部触发2,3,5和6,那么请查看motionEvent.getSize()。这将衡量触摸的"fatness"从0到1.如果getToolMajor()getTouchMajor()可用,它们可能会帮助您估算触及的实际像素数。知道screen size可能会有所帮助,但据我在文档中可以看出,使用任何这些产生的像素大小都是近似的。某些测试将有助于确定它是否按原样工作,或者是否需要任何缩放常数。这可能比你期望的要小,因为它们是专为油漆程序而设计的,可以增加压力,而不是让你的指尖碰到东西。

使用它就像容差一样在点击周围建立另一个Rect(让我们称之为fatFinger)。在循环中测试r.intersects(fatFinger),为您提供图像上的每rr。每次它都是真的,你找到了另一个t来处理。

这应该给你类似(g)的东西。现在,3台印刷机是2,3,5和5。 6按,1按现在是1&amp; 4按和8按是8&amp; 0按。

2印刷机奇迹般地只是2印刷机。拉出它几乎和用触点点击点一样难。这可能适合您的游戏,但请不要在我的手机上使用。 :)

如果你不想疯狂,可以做一点OOP并为包含Rect的目标创建一个类,并提供由Rect支持的自己的intersects方法。通过这种方式,您可以循环播放,获取每个t.intersects(fatFinger),当t.wasTouched();为真时,您可以调用自己的{{1}}

简而言之,除非你想触及它附近的一切东西,否则会使目标变胖,而不是手指。如果是这样的话,那两个都会肥胖。

无论您决定使用(f)还是(g),我认为如果采用这种方法,您将发现用户配置手指大小的需求要少得多。快乐的编码!

答案 2 :(得分:0)

  

有没有一种方法可以设置某种容差,可以从设置菜单中进行调整,以便人们可以轻松地使用不同尺寸的手指并使用不同的屏幕尺寸进行播放

如果我理解正确,只需将您的公差存储在DP中并根据屏幕密度进行转换。 以编程方式,您可以按照此处所述进行转换:Convert dip to px in Android 或者在dimens.xml文件中存储可用的容差值,并从那里读取这些值。