我有一些添加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];
}
有什么想法吗?
答案 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的一个子类,可以为你做淡入淡出。