2009-06-23 29 views
14

Tôi đang cố gắng tạo hoạt ảnh khung hình rất đơn giản, nhờ đó đồ họa Xoay từ góc này sang góc khác, thông qua một điểm giữa nhất định.Hoạt ảnh cơ bản về khung hình chính (xoay)

(Mục đích là để có thể để animate xoay qua một góc hồ quang LỚN HƠN 180 DEGREES, thay vì phải các hình ảnh động 'lừa' và đi con đường ngắn nhất, tức là thông qua đối diện , CẤP TÍNH góc nhỏ hơn - có thể xảy ra khi chỉ có một khung chính [tức là đích]. Để đi theo chiều dài '' xung quanh, tôi giả sử tôi cần thêm một khung hình chính ở giữa, dọc theo mong muốn arc.)

Đây là những gì tôi đã có cho đến nay (mà không có được đồ họa để xoay mong muốn, thông qua các góc độ cấp tính nhất):

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__)/180.0 * M_PI) 

... 

[UIView beginAnimations:nil context:nil]; 
CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(desiredEndingAngle)); 
[UIView setAnimationDuration:0.5]; 
graphic.transform = cgCTM; 
[UIView commitAnimations]; 

Theo tôi được biết, tôi không tìm kiếm hình ảnh động dọc theo một con đường (vì đó là cho dịch, chứ không phải là Rotation) ...

Dù sao, bất kỳ trợ giúp sẽ được đánh giá rất cao! Cảm ơn trước.

+0

Làm rõ nhanh (vì đã lâu rồi tôi lấy Hình học)! Mục đích là để xoay kim trên một máy đo loại SPEEDOMETER, có dấu hiệu bao gồm hơn 180 DEGREES. Như bây giờ, khi kim đi từ gần 0 đến gần Max, phải mất khoảng cách ngắn nhất để đến đó ... do đó, đi qua khu vực "6 giờ", nơi không có dấu (ví dụ, nơi nó nói "MPH" thay thế). Tôi cần một cách, về cơ bản, xác định DIRECTION nào quay vòng xảy ra. Có lẽ, điều đó có nghĩa là chiều kim đồng hồ/ngược chiều kim đồng hồ, hoặc thông qua một điểm giữa được chỉ định. Do đó, ý tưởng về một khung hình chính bổ sung. Cảm ơn! –

Trả lời

18

suy nghĩ tôi đã có nó.

Dưới đây là mã mà không (trong ví dụ này) đầy đủ 270 DEGREE xoay (radian 1,5 * pi), bao gồm các thông số khác nhau có thể được tùy chỉnh thêm:

CALayer *layer = rotatingImage.layer; 
CAKeyframeAnimation *animation; 
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.duration = 0.5f; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.values = [NSArray arrayWithObjects:  // i.e., Rotation values for the 3 keyframes, in RADIANS 
     [NSNumber numberWithFloat:0.0 * M_PI], 
     [NSNumber numberWithFloat:0.75 * M_PI], 
     [NSNumber numberWithFloat:1.5 * M_PI], nil]; 
animation.keyTimes = [NSArray arrayWithObjects:  // Relative timing values for the 3 keyframes 
     [NSNumber numberWithFloat:0], 
     [NSNumber numberWithFloat:.5], 
     [NSNumber numberWithFloat:1.0], nil]; 
animation.timingFunctions = [NSArray arrayWithObjects: 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], // from keyframe 1 to keyframe 2 
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], nil]; // from keyframe 2 to keyframe 3 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

[layer addAnimation:animation forKey:nil]; 

Cảm ơn!

+0

Tính năng này hoạt động với [xoay 360 độ] (http://stackoverflow.com/a/1216951/1309352). –

1

Hãy thử điều này:

UIImageView* rotatingImage = [[UIImageView alloc] init]]; 
[rotatingImage setImage:[UIImage imageNamed:@"someImage.png"]]; 

CATransform3D rotationTransform = CATransform3DMakeRotation(1.0f * M_PI, 0, 0, 1.0); 
CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 

rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform]; 
rotationAnimation.duration = 0.25f; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = 1; 

[rotatingImage.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
+0

Xin chào, Nathan! Cảm ơn bạn rất nhiều vì phản hồi và chuyên môn của bạn. Tôi nhận được lỗi sau trên dòng cuối cùng: "yêu cầu cho thành viên 'lớp' trong một cái gì đó không phải là một cấu trúc hoặc công đoàn". Tôi tưởng tượng tôi đang thiếu một số thiết lập khác (như UIImage thường không có một thuộc tính Layer). Là thương hiệu mới cho Core Animation, tôi vẫn còn một chút khó khăn. [Cũng không chắc chắn cách này chỉ định một điểm giữa, hoặc cách khác, một DIRECTION cho phép quay (về cơ bản là sự lựa chọn của chiều kim đồng hồ hoặc ngược chiều kim đồng hồ), nhưng tôi chắc chắn nó sẽ trở nên rõ ràng khi tôi có thể chạy nó.] cảm ơn bạn/tất cả vì sự giúp đỡ của add'l! –

+0

Tôi đã sửa mẫu mã - Tôi đã thêm hoạt ảnh vào UIImage thay vì UIImageView chứa UIImage, điều này sẽ không hoạt động vì những lý do rõ ràng :-) –

+0

Cảm ơn, Nathan, điều đó có ý nghĩa và nó hiện đang biên dịch. Gần như tôi có thể nói, mặc dù, thật không may, tôi dường như trở lại gần nơi tôi bắt đầu: Cố gắng làm một vòng quay, nói, 270 độ (1,5 * pi radian) theo một hướng ... kết quả trong một * 90 độ * xoay theo hướng ngược lại thay vào đó (tức là, đường tròn ngắn)! Tôi tin rằng câu trả lời là với CAKeyframeAnimation hơn là CABasicAnimation, vì nó cho phép kiểm soát nhiều hơn đối với chuyển động thực tế. Tôi đang chơi với điều đó và sẽ đăng bất kỳ câu trả lời nào tôi đưa ra hoặc bất kỳ câu hỏi nào khác trong một bài đăng riêng biệt. Cảm ơn bạn đã dành thời gian! –

1
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, 100, 100); 
CGPathAddQuadCurveToPoint(path, NULL, 100, 100, 100, 615); 
CGPathAddQuadCurveToPoint(path, NULL, 100, 615, 900, 615); 
CGPathAddQuadCurveToPoint(path, NULL, 900, 615, 900, 100); 
CGPathAddQuadCurveToPoint(path, NULL, 900, 100, 100, 80); 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
pathAnimation.path = path; 
pathAnimation.duration = 10.0; 
[someLayer addAnimation:pathAnimation forKey:nil]; 
Các vấn đề liên quan