CoreAnimation与QTMovieView上的-setAlphaValue不兼容

时间:2009-10-25 19:07:54

标签: cocoa core-animation

我有一些添加QTMovieView的基本代码。我想让它淡入,所以我在setAlphaValue上添加了一个动画。唯一的问题是它不起作用。 alpha值立即设置为应该设置为动画的任何值。如果我尝试动画,例如setFrame:它工作正常。你会在下面找到我的代码。这是使用Mac OS X 10.5 SDK的10.5.7。

    - (void)addMovie:(NSString *)aFile
    {
            QTMovieView     *aMovieView;
            QTMovie         *aMovie;
            NSRect          contentFrame;

            contentFrame = [[self contentView] frame];

            aMovieView = [[QTMovieView alloc]
                            initWithFrame:contentFrame];
            [aMovieView setWantsLayer:YES];
            [aMovieView setControllerVisible:NO];
            [aMovieView setPreservesAspectRatio:YES];

            aMovie = [[QTMovie alloc]
                            initWithFile:aFile error:nil];

            [aMovieView setMovie:aMovie];

            [aMovieView setAlphaValue:0.4];

            [[self contentView] addSubview:aMovieView];

            [NSAnimationContext beginGrouping];
            [[NSAnimationContext currentContext] setDuration:2.0];
            [[aMovieView animator] setAlphaValue:0.9];
            [NSAnimationContext endGrouping];

    }

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我不确定,但听起来QTMovieView可能不支持alpha合成。我将尝试的另一个测试是在QTMovieView的超级视图上调用setWantsLayer,看看它是否会影响QTMovieViews正确合成的能力。可能不起作用。

您可以尝试使用QTMovieLayer。合并QTMovieLayer的一种方法是创建自己的NSView子类,创建并管理在其根层内添加的QTMovieLayer。请注意,当在同一窗口中将图层支持的视图与非图层支持的视图混合时,如果图层支持的视图不在前面或后面并且重叠,那么您可能会得到有趣的排序。

答案 1 :(得分:1)

我开始使用QTMovieLayer,但当然不如QTMovieView那么强大,它打开了另一盒问题。解决方案是在QTMovieView上使用NSAnimation。我有一个看起来像这样的NSAnimation类:

<强> AlphaAnimation.h

    #import <Cocoa/Cocoa.h>

    NSString * const AAFadeIn;
    NSString * const AAFadeOut;

    @interface AlphaAnimation : NSAnimation {
            NSView          *animatedObject;
            NSString        *effect;
    }
    - (id)initWithDuration:(NSTimeInterval)duration effect:(NSString *)effect object:(NSView *)object;
    @end

<强> AlphaAnimation.m

    #import "AlphaAnimation.h"

    NSString * const AAFadeIn = @"AAFadeIn";
    NSString * const AAFadeOut = @"AAFadeOut";

    @implementation AlphaAnimation
    - (id)initWithDuration:(NSTimeInterval)aDuration effect:(NSString *)anEffect object:(NSView *)anObject
    {
            self = [super initWithDuration:aDuration animationCurve:0];

            if (self) {
                    animatedObject = anObject;
                    effect = anEffect;
            }

            return self;
    }

    - (void)setCurrentProgress:(NSAnimationProgress)progress
    {
            if ([effect isEqual:AAFadeIn])
                    [animatedObject setAlphaValue:progress];
            else
                    [animatedObject setAlphaValue:1 - progress];
    }
    @end

然后可以这样使用:

animation = [[AlphaAnimation alloc] initWithDuration:0.5 effect:AAFadeIn object:movieView];

[animation setAnimationBlockingMode:NSAnimationNonblocking];
[animation startAnimation];

如果您的QTMovieViews全屏显示,那么它不是很顺利。

答案 2 :(得分:1)

我建议使用NSViewAnimation。它是NSAnimation的一个子类,可以为你做淡入淡出。