Cli*_*uza 5 java android area touch
我一直在尝试开发这个游戏,用户必须点击图像上的某些点.我一直根据像素位置存储这些点.通过获取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
}}}
Run Code Online (Sandbox Code Playgroud)
这里XMin和XMax是X坐标可以的最小和最大范围,Ymin和Ymax是Y坐标的最小和最大范围.
XCood和YCood是用户触摸的a和y坐标.
users have to click certain points on a image告诉我,您不是在图像上放置不可见/透明的按钮,每个按钮都有自己的事件处理,而是选择将图像上的任何点击发送到一个地方,并决定哪些点击与哪个目标相关。
(A)
(二)
(C)
这意味着如果您的图像看起来像 (a),那么您将设置像 (b) 这样的点(像素位置):
这是可以理解的,这会给你带来问题,因为人类很难击中这些小目标。
你已经决定解决这个问题的方法是让人类的手指更粗,并且正在尝试校准使它们变得更粗的程度。让我们尝试一个用户尝试拨打 1238 的用例。在 (c) 中,我在拨打时增加了他们手指的大小。由于 8 上的新闻覆盖了 8 和 0 的点,我想说这太大了。
(四)
(五)
(F)
(d) 显示了用这种方法校准的合理尺寸。请注意,1 和 3 仍然未命中。1 是一个失误,因为这些按钮不是方形的。这是这种胖手指方法的局限性。3 是未击中,因为人类实际上未击中并击中了按钮之间。如果你坚持认为 3 应该算在内,我不知道如果没有 2、5 和 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 诸神嗤之以鼻并拒绝了按钮的想法我想说的是每次点击你都会循环遍历所有目标测试 contains()。
(G)
现在,如果您确实坚持认为当用户错过点击 3 时,2、3、5 和 6 都应该触发,那么请查看motionEvent.getSize()。这将测量从 0 到 1 的触摸“厚度”。getToolMajor()如果或getTouchMajor()可用,它们可能会帮助您估计触摸的实际像素。了解屏幕尺寸可能会有所帮助,但据我从文档中可以看出,使用其中任何一个产生的任何像素尺寸都将是近似值。一些测试将有助于确定这是否按原样工作或是否需要任何缩放常数。这可能比您预期的要小,因为它们是为绘画程序设计的,可以通过增加压力来提供更大胆的笔触,而不是为了观看您的指尖碰撞到物体。
使用类似的容差在点击周围构建另一个矩形(我们称之为fatFinger)。r.intersects(fatFinger)循环测试,为您提供r图像上的所有内容。每次这是真的,你就会找到另一个人r来对付。
这应该给你类似(g)的东西。现在按 3 是按 2、3、5 和 6,按 1 现在是按 1 和 4,按 8 是按 8 和 0。
奇迹般的是,2 次按下仍然只是 2 次按下。实现这一点几乎与用触摸点击中点一样困难。这可能适合您的游戏,但请不要对我的手机这样做。:)
如果您不想发疯,请做一点 OOP 并为您的目标创建一个包含 矩形 的类,并提供由 矩形 支持的您自己的 intersects 方法。这样你就可以循环它们,获取每个t,当t.intersects(fatFinger)为真时你可以调用你自己的t.wasTouched();
简而言之,让目标变胖,而不是手指,除非你想让它接触到它附近的所有东西。如果是这样,请将两者都养肥。
无论您决定使用 (f) 还是 (g),我认为如果您采用这种方法,您会发现用户配置手指尺寸的需要要少得多。快乐编码!
| 归档时间: |
|
| 查看次数: |
525 次 |
| 最近记录: |