CGContextStrokePath () вызывает "точки" в приложении для рисования в реальном времени (рисование пальцем) - PullRequest
2 голосов
/ 02 июня 2011

Я пытаюсь написать приложение типа рисования пальцем. Я начинаю путь в touchesBegan и добавляю к нему путь в touchesMoved. В touchsMoved я использую следующий код:

CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y);

CGContextStrokePath(context);

Я вызываю CGContextStokePath, чтобы путь отображался в реальном времени по мере рисования пользователем. Проблема в том, что при использовании низких значений альфа я получаю точки между последовательными сегментами пути, где концевая заглушка по существу рисуется дважды - один раз для предыдущего сегмента и один раз для текущего сегмента.

Я пробовал использовать разные заглавные буквы, но результат не очень хорош. Я также попытался использовать функцию CGContextDrawPath со всеми различными константами, и я получил тот же результат.

Вы можете увидеть результаты здесь: http://www.idea -asylum.com / pathwithdots / index.html - показывает линию с альфа = 1,0 и строку с альфа = 0,2.

Есть идеи? Заранее спасибо!

1 Ответ

3 голосов
/ 04 июня 2011

Во-первых, я надеюсь, что вы рисуете каждую фигуру в отдельном слое (и я не имею в виду CALayer, я имею в виду внутреннюю конструкцию, уникальную для вашего приложения). Это не только упрощает эту задачу, но и делает отмену более или менее безболезненной (просто переместите последний / самый верхний слой в другой массив и скройте его, и очистите этот массив, когда пользователь рисует новый слой).

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

В-третьих, каждый раз, когда вы обновляете фигуру во время ее создания, до сих пор получаете ее площадь, лишаете законной силы этот участок и перерисовываете все слои под ним, а также нарисованную фигуру (как она существует до сих пор). То есть перерисовать фон, перекрывая новую фигуру, а затем нарисуйте сверху новую версию новой фигуры.

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

...