我想要做的是將手指在屏幕上移動(touchesMoved)並沿touchesMoved生成的點繪製均勻間隔的圖像(可能是CGImageRefs)。我可以畫線,但我想要生成的東西看起來像這樣(對於這個例子,我使用的是一個箭頭的圖像,但它可能是任何圖像,可能是我的狗的圖片:))主要的是當用iPhone或iPad上的手指進行繪圖時,圖像均勻分佈。在iOS中沿着路徑均勻地繪製圖像
回答
假設您已有追蹤用戶的觸摸,因爲他們把他們的觸摸屏幕上的代碼,這聽起來像你想,當他們搬到等於圖像的長度的距離來檢測,此時你想在他們的觸摸下繪製另一個圖像副本。
要做到這一點,我想你將需要:
- 計算圖像的長度(寬度)
- 執行代碼來繪製圖像的拷貝到您的視圖,旋轉到任何角度 每次用戶的觸摸移動時(例如在touchesMoved :)中:
- 每次移動觸摸時計算觸摸的增量,並生成該增量的「長度」(例如像sqrt(dx^2 + dy^2))
- 累積距上一幅圖像的距離
- 如果距離已達到圖像的長度,請在觸摸的當前位置下繪製圖像的副本,並進行適當旋轉(可能根據從最後一個圖像到當前位置)
你覺得如何?
首先是巨大的道具出去肯德爾。所以,根據他的回答,這裏是取UIImage的代碼,根據觸摸之間的距離在屏幕上沿着路徑繪製它(不是真實的路徑參考,只是由點創建的邏輯路徑),然後旋轉圖像正確地基於當前點和前一點的VECTOR。我希望你喜歡它:
首先你需要加載圖像被一遍又一遍用作CGImage:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"arrow.png" ofType:nil];
UIImage *img = [UIImage imageWithContentsOfFile:imagePath];
image = CGImageRetain(img.CGImage);
請確保您的dealloc您致電
CGImageRelease(image);
然後在touchesBegan中,將起始點存儲在方法外的var中(在此標頭中聲明它:)在這種情況下,我將繪製到UIView中
然後在觸摸開始:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self];
}
終於在touchesMoved,繪製位圖到屏幕上,然後當你的距離已經移動到足以(以我的情況73,因爲我的圖像是73像素x 73像素)將該圖像繪製到屏幕上,保存新圖像並將lastPoint設置爲currentPoint
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
currentPoint = [touch locationInView:self];
double deltaX = lastPoint.x - currentPoint.x;
double deltaY = lastPoint.y - currentPoint.y;
double powX = pow(deltaX,2);
double powY = pow(deltaY,2);
double distance = sqrt(powX + powY);
if (distance >= 73){
lastPoint = currentPoint;
UIGraphicsBeginImageContext(self.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
CGContextSaveGState(UIGraphicsGetCurrentContext());
float angle = atan2(deltaX, deltaY);
angle *= (M_PI/180);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(currentPoint.x, currentPoint.y, 73, 73),[self CGImageRotatedByAngle:image angle:angle * -1]);
CGContextRestoreGState(UIGraphicsGetCurrentContext());
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
distance = 0;
}
}
- (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle
{
CGFloat angleInRadians = angle * (M_PI/180);
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGRect imgRect = CGRectMake(0, 0, width, height);
CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext = CGBitmapContextCreate(NULL,
rotatedRect.size.width,
rotatedRect.size.height,
8,
0,
colorSpace,
kCGImageAlphaPremultipliedFirst);
CGContextSetAllowsAntialiasing(bmContext, FALSE);
CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(bmContext,
+(rotatedRect.size.width/2),
+(rotatedRect.size.height/2));
CGContextRotateCTM(bmContext, angleInRadians);
CGContextTranslateCTM(bmContext,
-(rotatedRect.size.width/2),
-(rotatedRect.size.height/2));
CGContextDrawImage(bmContext, CGRectMake(0, 0,
rotatedRect.size.width,
rotatedRect.size.height),
imgRef);
CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
CFRelease(bmContext);
[(id)rotatedImage autorelease];
return rotatedImage;
}
這將創建一個看起來像這樣的圖像:
將增加以下內容(以便儘量在空隙填補一些修改上面的代碼,其中touchesMoved丟失當你快速移動時有一些點:
CGPoint point1 = CGPointMake(100, 200);
CGPoint point2 = CGPointMake(300, 100);
double deltaX = point2.x - point1.x;
double deltaY = point2.y - point1.y;
double powX = pow(deltaX,2);
double powY = pow(deltaY,2);
double distance = sqrt(powX + powY);
distance = 0;
for (int j = 1; j * 73 < distance; j++)
{
double x = (point1.x + ((deltaX/distance) * 73 * j));
double y = (point1.y + ((deltaY/distance) * 73 * j));
NSLog(@"My new point is x: %f y :%f", x, y);
}
要添加以下內容(對上述代碼進行一些更改以嘗試填充touchesMoved在快速移動時缺少一些點的空白處: – cdasher
感謝您的幫助,我該如何繪製x和y點建議我 – dineshprasanna
uper代碼中的drawimage是什麼 –
- 1. 在openlayer3中沿着地圖的路徑繪製折線
- 2. 在iOS中沿路徑檢測繪圖
- 3. 沿路徑繪製圖案
- 4. 沿着路徑繪製重複的圖像(平鋪)
- 5. 在安卓繪圖中,如何沿多邊形路徑繪製均勻的筆畫?
- 6. 沿着曲線路徑放置圖像
- 7. 沿着曲線繪製動畫圖像
- 8. 在KineticJS中沿着光標路徑繪製線條
- 9. 沿路徑繪製Threejs TextGeometry
- 10. 沿着地圖上的路徑繪製文本(如f.e.街道名稱)
- 11. 沿着曲線路徑在背景中移動的圖像android
- 12. 如何在pygame中沿着路徑散佈圖像?
- 13. 如何沿着路徑製作動畫
- 14. 沿着貝塞爾路徑繪製漸變
- 15. 沿着繪製的路徑生成物體?
- 16. 沿着路徑的ActionScript 2
- 17. QGraphicsItem沿着路徑移動
- 18. 沿着路徑滾動Paper.js
- 19. 沿着路徑拖動snap.svg
- 20. 在Android上沿着路徑動畫圖像?
- 21. 沿着圓形路徑移動圖像視圖
- 22. 沿着Bezier曲線路徑的iPhone移動UI圖像視圖
- 23. 沿路徑繪製平行線 - PHP GD
- 24. WPF繪製箭頭沿路徑
- 25. 如何在WPF中沿着路徑繪製一行加三角形?
- 26. 在android地圖上繪製路徑
- 27. iOS的 - 如何繪製漸變沿路徑
- 28. IOS:使用谷歌地圖繪製最佳路線路徑
- 29. 約束拖動沿着路徑在iphone
- 30. iphone可可:如何沿着路徑拖動圖像
讓我試試吧。我從來沒有想過將圖像的位置放在距離上。我想我需要添加或調整路徑上的點。 – cdasher
正是我在找的東西,會在清理完後發佈工作代碼。 (你沒有脫離你的頭頂知道如何計算一個合適的矢量你:) :) – cdasher
想出了矢量謝謝! – cdasher