是否可以在IOS应用程序中检测到fingerize? 我在文档中读到了:
注意:屏幕上的手指提供了不同的级别 精度比鼠标指针。当用户触摸屏幕时, 接触区域实际上是椭圆形的,并且往往偏向下方 用户认为他或她触摸的点。这个“联系方式 贴片“的大小和形状也根据手指触摸而变化 屏幕,手指的大小,手指的压力 屏幕,手指的方向和其他因素。该 底层Multi-Touch系统为您分析所有这些信息 并计算一个接触点。
那么,这是否意味着SDK无法检测到物理手指大小?我想要完成的任务:我需要在我的OpenGL ES应用程序中使用虚拟“按钮”。如果有人像游戏手柄一样拿着iPhone,他会用一根手指按两个按钮(滚动拇指)。我希望我的意思是可以理解的......
有什么想法吗?
答案 0 :(得分:11)
@fichek是对的,没有常规方法来获得指尖的大小。
然而,我在之前的项目中使用了一种“奇怪”的方式来做它,它只是起作用; - )
1.告诉我们的用户将两根手指放在屏幕上,越接近越好(就像Mac上的双指滚动手势):
2.在 touchesBegan:withEvent:方法中获取 UITouches 中的两个 CGPoints ;
3.现在我们有CGPoint fingertip1center 和 fingertip2center ,所以:
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;
}
希望这些可以提供帮助!
Yichao Peak Ji
答案 1 :(得分:5)
实际上,有一种获得触摸半径的方法:
-(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/
答案 2 :(得分:2)
iOS会在幕后进行各种手指大小/角度/位置计算,因此无法检测除触摸计算位置之外的任何内容。但是,这足以让您知道手指在游戏手柄的哪个部分。
正如@marcus提到的那样,你应该实现touchesMoved:withEvent:方法并检查触摸的位置,以确定它是在左/右/上/下/中心还是你想要的任何“按钮”。