2011-01-23 22 views
0

次のコードがありますが、滑らかではありません。私が円を描くと、鋭い角が見えます。iPhoneで指のスライド/タッチモーションで滑らかな線を描くにはどうすればよいですか?

UIGraphicsBeginImageContext(self.view.frame.size); 
[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0); 
CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), YES); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
CGContextStrokePath(UIGraphicsGetCurrentContext()); 
drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+2

だけで簡単なメモ...あなたはあなたのUIGraphicsGetCurrentContextが右UIGraphicsBeginImageContext後に1回の呼び出しで呼び出して交換して変数に結果を保存したい場合があります。 1行ごとにUIGraphicsGetCurrentContextを呼び出す必要はありません。非効率で読みにくいです。 – v01d

答えて

0

あなたはすべてが二以上の1 /第60回をとる、あまりにも多くの短いアンチエイリアス直線セグメントを描画しているので、あなたは、このように、鋭い角のいくつかを見ているあなたは、UIのタッチイベントの更新、リード線が欠落してしまいますよりジャグジーな道へ

iOSデバイスで2D CG描画が高速化されていません。

CG描画に固執する場合は、最後の4行程度の線分だけを描画して、アンチエイリアス処理をオフにしてより滑らかに見えるようにしてください。その後、パスの描画が完了したら(タッチアップ)、残りの部分を入力します。

0

フル60FPSであっても、カーブの代わりにエッジが得られます。 CGでの最善の策は、ベジェパスを使うことです。 CGの外側、スプライン。

0

あなたがしなければならないことは、タッチが動くたびに描画関数を呼び出すのではなく、アキュムレータを作成し、呼び出されるたびにインクリメントを増やすことです。ある閾値に達すると、描画コードを実行します。最初にメソッドが呼び出されるときには必ず実行する必要があります。良いしきい値を見つけるには、それを試してみる必要があります。

static int accum = 0; 
if ((accum == 0) || (accum == threshold)) { 
UIGraphicsBeginImageContext(self.view.frame.size); 
[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0); 
CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), YES); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
CGContextStrokePath(UIGraphicsGetCurrentContext()); 
drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
accum = 0; 
} 
accum++; 
+0

このアプローチが十分に敏感でない場合、currentPointとlastPointの間の距離に基づいてしきい値を動的に変更することができます。しきい値はその差に反比例する必要があります。 – Rich

関連する問題