如何使用IOS检测手指大小?

如何使用IOS检测手指大小?,ios,multi-touch,Ios,Multi Touch,是否可以在IOS应用程序中检测fingersize? 我在文档中读到: 注意:屏幕上的一个手指提供了一种完全不同的视觉效果 精度比鼠标指针高。当用户触摸屏幕时 接触区域实际上是椭圆形的,并且倾向于在下方偏移 用户认为他或她触碰的点。这个“联系人” “贴片”的大小和形状也因手指接触的部位而异 屏幕、手指的大小、手指在屏幕上的压力 屏幕、手指的方向和其他因素。这个 底层多点触摸系统为您分析所有这些信息 并计算单个接触点 资料来源: 那么,这是否意味着SDK不可能检测物理尺寸?我想要完成的是:我需要在

是否可以在IOS应用程序中检测fingersize? 我在文档中读到:

注意:屏幕上的一个手指提供了一种完全不同的视觉效果 精度比鼠标指针高。当用户触摸屏幕时 接触区域实际上是椭圆形的,并且倾向于在下方偏移 用户认为他或她触碰的点。这个“联系人” “贴片”的大小和形状也因手指接触的部位而异 屏幕、手指的大小、手指在屏幕上的压力 屏幕、手指的方向和其他因素。这个 底层多点触摸系统为您分析所有这些信息 并计算单个接触点

资料来源:

那么,这是否意味着SDK不可能检测物理尺寸?我想要完成的是:我需要在OpenGL ES应用程序中使用虚拟“按钮”。如果有人拿着iPhone就像拿着游戏板一样,他可能会用一根手指按两个按钮(用拇指滚动)。我希望我的意思可以理解


有什么想法吗?

iOS在幕后进行各种手指大小/角度/位置计算,因此除了计算出的触摸位置之外,无法检测任何东西。然而,这些信息足以让你知道手指在游戏板的哪一部分


正如@marcus所提到的,您应该实现touchesMoved:withEvent:method,并检查touch的位置,以确定它是否位于左/右/上/下/中间或任何您想要的“按钮”之上。

@fichek是对的,没有常规方法可以获得指尖的大小

然而,在我以前的项目中,我使用了一种“奇怪”的方式来完成它,它只是工作;-)

1.告诉用户将两个手指放在屏幕上,越近越好(如Mac上的两个手指滚动手势):

2.从触摸开始:withEvent:方法中的UITouchs获取两个CGPoints

3.现在我们有CGPointfingertip1centerfingertip2center,因此:

float fingertip_Diameter=fabsf(fingertip1center.x-fingertip2center.x);
4.手指非常近,我们可以忽略宽度上的微小差异,因此dX==单个手指的实际宽度

5.宽度(dX)和指尖倾斜成比例,我们可以简单地使用

float fingertip\u Size=M\u 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;
}
#定义kTestLevelOne 5//测试5个点:原点、左、右、上、下
#定义ktestlevel两个9//和其他4个角
-(布尔)测试环绕点:(CGPoint*)点
{
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};

对于(inti=0;i实际上,有一种方法可以获得接触半径:

-(void)touchesBegan:(NSSet *)touches 
      withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGFloat touchSize = [[touch valueForKey:@"pathMajorRadius"] floatValue];
    NSLog(@"touch size is %.2f", touchSize);
}
资料来源:

您只需处理
(void)touchesMoved:(NSSet*)toucheevent:(UIEvent*)即可事件
并检查给定触控的
位置查看
。因此,您将拥有一个游戏板视图/区域,并检查触控移动时命中/覆盖的部分。但我只能从位置查看中检索一个CGPoint,而不能同时检索两个按钮位置。因此iOS似乎只检测到一个“blob”(不是两个都有-一个大拇指不会被检测为两次触摸)…你仍然可以在gamepad视图中找到一个区域,这对两个按钮都有效-想想按钮之间的交叉。W3C中有一个草案要求操作系统向开发者公开这些属性。希望在未来Safari实现这一点,我们可以使用它!