簡體   English   中英

使用CALayer for iphone創建ken燒傷效果時遇到問題

[英]having trouble creating ken burns effect with CALayer for iphone

在過去的幾天里,我一直在嘗試使用帶有動畫的CALayer創建ken burns效果,然后將其保存到視頻文件中。

我的圖像層位於另一個1024x576的圖層中。 所有動畫都應用於圖像層。

這是迄今為止的代碼:

- (CALayer*)buildKenBurnsLayerWithImage:(UIImage *)image startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint fromScale:(float)fromScale toScale:(float)toScale
{
    float calFromScale = fromScale + 1;
    float calToScale = toScale + 1;
    float fromX = startPoint.x * calFromScale;
    float fromY = (image.size.height * calFromScale) - (videoSize.height + (startPoint.y * calFromScale));
    float toX = endPoint.x * calToScale;
    float toY = (image.size.height * calToScale) - (videoSize.height + (endPoint.y * calToScale));

    CGPoint anchor = CGPointMake(0.0, 0.0);

    CALayer* imageLayer    = [CALayer layer];
    imageLayer.contents    = (id)image.CGImage;
    imageLayer.anchorPoint = anchor;
    imageLayer.bounds      = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    imageLayer.position    = CGPointMake(image.size.width * anchor.x, image.size.height * anchor.y);
    imageLayer.contentsGravity = kCAGravityResizeAspect;

    // create the panning animation.
    CABasicAnimation* panningAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
    panningAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(-fromX, -fromY)];
    panningAnimation.toValue   = [NSValue valueWithCGPoint:CGPointMake(-toX, -toY)];
    panningAnimation.additive = YES;
    panningAnimation.removedOnCompletion = NO;

    // create the scale animation.
    CABasicAnimation* scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    scaleAnimation.fromValue = [NSNumber numberWithFloat:fromScale];
    scaleAnimation.toValue = [NSNumber numberWithFloat:toScale];
    scaleAnimation.additive = YES;
    scaleAnimation.removedOnCompletion = NO;

    CAAnimationGroup* animationGroup = [CAAnimationGroup animation];
    animationGroup.animations = [[NSMutableArray alloc] initWithObjects:panningAnimation,scaleAnimation, nil];
    animationGroup.beginTime = 1e-100;
    animationGroup.duration = 5.0;
    animationGroup.removedOnCompletion = NO;
    animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

    [imageLayer addAnimation:animationGroup forKey:nil];

    return imageLayer;
}

這是我如何調用方法:

CALayer* animatedLayer = [self buildKenBurnsLayerWithImage:image startPoint:CGPointMake(100, 100) endPoint:CGPointMake(500, 500) fromScale:5.0 toScale:2.0];

我遇到的問題是,平移和縮放的最終結果是屏幕上的幾個像素。

如果有人知道如何解決這個問題,我將非常感激。

所有變換都應用於錨點。 嘗試使用錨點

CGPoint anchor = CGPointMake(0.5f, 0.5f);

您的“視口”不應再縮放到右下角(如果這是導致動畫被幾個像素偏離的原因),但同樣適用於所有方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM