Как я могу сохранить траекторию движения пальцев в объективе c? - PullRequest
1 голос
/ 01 марта 2012

Я хочу сохранить траекторию движения пальцев на экране iPhone.На данный момент я просто читаю прикосновения и добавляю CGPoints в NSMutableArray.когда я пытаюсь напечатать все точки cgpoint в этом массиве, как некоторые промежуточные точки.Есть ли лучший способ для этого?Можем ли мы сохранить весь путь напрямую?

Вот код, который я использую

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 {

fingerSwiped = NO;
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self.view];
[self.myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];
  }


 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
   {
fingerSwiped = YES;

UITouch *touch = [touches anyObject];   
CGPoint currentPoint = [touch locationInView:self.view];



UIGraphicsBeginImageContext(self.view.frame.size);
[slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth);
//CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0);
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
slateImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
[myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];   
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

if(!fingerSwiped) 
{
    UIGraphicsBeginImageContext(self.view.frame.size);
    [slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth);
    //CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0);
    CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    CGContextFlush(UIGraphicsGetCurrentContext());
    slateImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];
}
}

1 Ответ

6 голосов
/ 01 марта 2012

Вы записываете каждую точку, которую iOS хочет дать вам.

iOS сообщает только о событиях, перемещаемых касанием, каждые 16,67 миллисекунды (60 раз в секунду). Насколько я знаю, нет способа быстрее получить обновленные места касания.

Вы говорите, что получаете прямые линии при нанесении точек касания. Это происходит потому, что пользователь двигает пальцем так быстро, что касание перемещается на значительную величину за 16,67 миллисекунды. Прикосновение перемещается настолько далеко между обновлениями, что при соединении точек оно не выглядит как плавная кривая. К сожалению, (как я уже сказал) нет способа получать обновления быстрее, чем 60 раз в секунду.

Единственный способ справиться с этим - использовать сплайн-интерполяцию для соединения точек, о которых сообщается. Сплайн-интерполяция - сложная тема. Вы можете найти много информации об этом с помощью Google.

Пример этого можно увидеть в приложении Adobe Ideas на iPad. Если вы быстро рисуете большую спираль и смотрите внимательно, вы можете видеть, что линия становится более гладкой, когда вы поднимаете палец. Я полагаю, что он выполняет некоторое постепенное сглаживание, когда вы рисуете спираль, и когда вы поднимаете палец, он возвращается и вычисляет лучшую интерполяцию всей линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...