如何在IOS设备上检测手指大小?

7
在iOS应用程序中是否可能检测手指大小?
我在文档中读到:
注:屏幕上的手指与鼠标指针具有非常不同的精度。当用户触摸屏幕时,接触区域实际上是椭圆形的,并且往往偏离用户认为自己触摸的点。这个“接触区域”也因触摸屏幕的手指、手指大小、手指对屏幕的压力、手指的方向和其他因素而变化。底层的多点触控系统会为您分析所有这些信息并计算出一个单一的触摸点。
来源:https://web.archive.org/web/20121120152010/http://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html 那么,这是否意味着SDK无法检测物理手指大小?我的目的是:我需要在我的OpenGL ES应用程序中使用虚拟“按钮”。如果有人像游戏手柄一样握住iPhone,他可能会用一根手指按两个按钮(滑动拇指)。希望我表达清楚了...
有什么想法吗?

你可以处理 (void)touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event 并检查给定触摸的 locationInView。因此,您将拥有一个游戏手柄视图/区域,并检查哪个部分在 touchesMoved 上被点击/覆盖。 - marcus
但是我只能从locationInView中检索到一个CGPoint,而不是两个按钮位置。因此,iOS似乎只检测到一个“blob”(不是两个 - 一个大拇指不会被检测为2个触摸)... - Constantin
2
在游戏手柄视图中,仍然可以选择一个区域,使两个按钮都有效 - 想象一下这些按钮相互交错的情况。 - marcus
1
W3C有一份草案要求操作系统向开发人员公开这些属性。文档希望未来Safari能够实现并且我们可以使用它! - Mohsen
3个回答

11

@fichek是正确的,没法以常规方式获取手指尺寸。

然而,在我的上一个项目中,我使用了一种“奇怪”的方法来实现它,并且它也奏效了;-)

1.告诉用户将两个手指放在屏幕上,越近越好(就像Mac上的双指滚动手势): enter image description here

2.在touchesBegan:withEvent:方法中从UITouches获取两个CGPoints

3.现在我们有了CGPoint fingertip1centerfingertip2center,所以:

float fingertip_Diameter=fabsf(fingertip1center.x-fingertip2center.x);

4. 手指非常接近,我们可能忽略宽度上的微小差异,所以 dX == 单个手指的实际宽度

5. 宽度(dX)和指尖大小成正比,我们可以简单地使用

float fingertip_Size=M_PI*(dX/2)*(dX/2);

或者找到更好的算法来满足您的需求;-)

6. 一旦我们得到了大小(实际上,我们只关心直径),就很容易通过测试各种周围点来实现优化触摸的方法,例如:

#define kTestLevelOne 5 //Testing 5 points:origin,left,right,up,down
#define kTestLevelTwo 9 //And the other 4 corners
-(BOOL)testSurroundingPoints:(CGPoint *)pt
{
   float prob_x[kTestLevelTwo]={0,-dX/2,dX/2,0,0,-dX/2,-dX/2,dX/2,dX/2};
   float prob_y[kTestLevelTwo]={0,0,0,dX/2,-dX/2,dX/2,-dX/2,dX/2,-dX/2};

   for(int i=0;i<kTestLevelTwo;i++)
   {
      if([self gotItAtX:pt.x+prob_x[i] andY:pt.y+prob_y[i]]==YES)
       {
           NSLog(@"Got It!");
           Return YES;
           //Or break; We don't need to try more points!
       }
   }
   return NO;
}

希望这些能有所帮助! 易潮峰技术支持

5

2

iOS在幕后进行各种手指大小/角度/位置的计算,所以没有办法检测除触摸的计算位置之外的任何信息。然而,这已经足够让您知道手指在游戏手柄的哪个部分。

正如@marcus所提到的,您应该实现touchesMoved:withEvent:方法,并检查触摸的位置,以确定它是否在左侧/右侧/顶部/底部/中心或任何您想要的“按钮”上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接