【问题标题】:How to detect Fingersize with IOS?如何用IOS检测Fingersize?
【发布时间】:2011-07-27 10:28:04
【问题描述】:

是否可以在 IOS 应用程序中检测手指大小? 我已阅读文档:

注意:屏幕上的手指提供了完全不同的级别 精度高于鼠标指针。当用户触摸屏幕时, 接触区域实际上是椭圆形的,并且倾向于在下方偏移 用户认为他或她触摸的点。这个“联系 补丁”的大小和形状也会根据手指触摸的不同而变化 屏幕、手指大小、手指在屏幕上的压力 屏幕、手指的方向和其他因素。这 底层 Multi-Touch 系统为您分析所有这些信息 并计算单个接触点。

来源: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 击中/覆盖的部分。
  • 但我只能从 locationInView 中检索一个 CGPoint,而不是两个按钮位置。所以 iOS 似乎只检测到一个“blob”(不是两个都检测到 - 大拇指没有被检测为 2 次触摸)......
  • 您仍然可以在游戏手柄视图中找到一个对两个按钮都有效的区域 - 想想这些按钮相互交叉。
  • W3C 中有一个草案要求操作系统向开发人员公开这些属性。 docs。希望将来 Safari 能够实现这一点,我们可以使用它!

标签: ios multi-touch


【解决方案1】:

@fichek 是对的,没有常规的方法来获取指尖的大小。

但是,我在之前的项目中使用了一种“奇怪”的方式来做到这一点,而且它确实有效;-)

1.告诉我们的用户将两根手指放在屏幕上,越靠近越好(就像 Mac 上的两指滚动手势):

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;
}

希望这些能有所帮助!

一朝峰姬

【讨论】:

    【解决方案2】:

    其实有一种方法可以获取触摸半径:

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

    来源: http://easyplace.wordpress.com/2013/04/09/how-to-detect-touch-size-in-ios/

    【讨论】:

      【解决方案3】:

      iOS 在后台进行各种手指大小/角度/位置计算,因此除了计算出的触摸位置外,没有其他方法可以检测到。但是,这些信息足以让您知道手指在游戏手柄的哪个部分。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 2012-08-19
        • 1970-01-01
        相关资源
        最近更新 更多