Как определить размер пальца с помощью IOS?

Можно ли определить размер пальца в приложении для 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 как геймпад, он, вероятно, будет использовать один палец для двух кнопок (скатываясь с большого пальца). Надеюсь, понятно, что я имею в виду ...

Любые идеи?


person Constantin    schedule 27.07.2011    source источник
comment
Вы можете просто обработать (void)touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event и проверить locationInView данных касаний. Таким образом, у вас будет один вид / область геймпада и вы сможете проверить, какая часть попадает / закрывается при touchMoved.   -  person marcus    schedule 27.07.2011
comment
Но я могу получить только одну CGPoint из locationInView, а не для обеих позиций кнопок. Таким образом, iOS, похоже, вообще обнаруживает только один blob (не оба - большой палец не определяется как 2 касания) ...   -  person Constantin    schedule 28.07.2011
comment
Вы можете по-прежнему иметь область в представлении геймпада, которая будет действительна для обеих кнопок - подумайте о кнопках, пересекающих друг друга.   -  person marcus    schedule 28.07.2011
comment
В W3C есть черновик, который требует, чтобы ОС раскрывала эти свойства разработчику. docs. Надеюсь, что в будущем Safari реализует это, и мы сможем это использовать!   -  person Mohsen    schedule 23.06.2014


Ответы (3)


@fichek прав, штатного способа получить размер кончиков пальцев нет.

Однако в моем предыдущем проекте я использовал «странный» способ сделать это, и он просто работает ;-)

1.Попросите нашего пользователя положить два пальца на экран вместе, чем ближе, тем лучше (например, жест прокрутки двумя пальцами на Mac):  введите описание изображения здесь

2. Получите две CGPoints из UITouches в методе touchesBegan: withEvent:;

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

Надеюсь, это поможет!

Пик Ичао Цзи

person PeakJi    schedule 04.08.2011

Собственно, есть способ получить радиус касания:

-(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/

person crishoj    schedule 22.06.2014

iOS выполняет всевозможные вычисления размера / угла / местоположения пальца за кулисами, поэтому нет никакого способа обнаружить что-либо, кроме вычисленного местоположения касания. Однако этой информации более чем достаточно, чтобы знать, на какой части геймпада находится палец.

Как упоминал @marcus, вы должны реализовать метод touchMoved: withEvent: и проверить местоположение касания, чтобы определить, находится ли оно над левым / правым / верхним / нижним / центральным или любыми другими «кнопками», которые вы хотите иметь.

person Filip Radelic    schedule 03.08.2011