Способ анимации изображений (например, фильма) на iPhone без использования MPMoviePlayer
Мне нужно иметь возможность отображать анимацию поверх статического изображения.
Учитывая, что MPMoviePlayer не дает вам контроля над чем-либо полезным, я могу думать только об этом, используя несколько статических изображений, которые мы отображаем (по одному) для создания анимации, похожей на фильм.
Я знаю, что мы могли бы использовать UIImageView для этого (установив свойство UIImageView animationImages и затем вызвав startAnimation), однако у нас будет более 100 изображений в нашей анимации - поэтому использование памяти будет максимально использовано.
У кого-нибудь есть хорошие способы сделать такую анимацию? Используете Core Animation или OpenGL?
Я предполагаю, что нам нужно создать буфер изображений, и когда мы загружаем новые изображения, мы отображаем изображения из буфера изображений??
4 ответа
Вы можете использовать Core Animation CALayer для размещения вашей анимации и поменять серию CALayers в и из этого основного слоя для выполнения покадровой анимации. Вы можете установить содержимое CALayer для размещения кадров в CGImageRef, используя его свойство content. Ряд CALayers, содержащих ваши изображения, может быть создан и сохранен в NSMutableArray по мере необходимости, а затем удален, когда это сделано, чтобы минимизировать использование памяти.
Вы можете установить длительность перехода между фреймами, поместив в метод CATransaction команду replaceSublayer: with:, например:
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0.25f] // 1/4th of a second per frame
forKey:kCATransactionAnimationDuration];
[mainLayer replaceSublayer:[imageLayers objectAtIndex:oldImageIndex] with:[imageLayers objectAtIndex:newImageIndex]];
[CATransaction commit];
Вы также можете избежать использования CGImageRef в содержимом вашего основного слоя, если время отображения вашего кадра достаточно мало.
Как вы обнаружили, использование UIImageView.animationImages не работает, потому что он использует всю системную память и приведет к сбою вашего приложения. Вы можете использовать таймер и устанавливать свойство изображения UIImageView при каждом срабатывании таймера; объект UIImage, который вы используете в качестве содержимого, необходимо будет загружать при каждом срабатывании таймера. Это в основном аналогично подходу, описанному в другом ответе, за исключением того, что он использует CALayer вместо UIImageView. Загрузка изображения и изменение содержимого изображения при каждом срабатывании таймера - это нормальный подход, но он сможет получить только около 11 FPS на iPhone для полноэкранных изображений.
Если вы хотите использовать рабочий пример, который реализует логику переключения UIImageView, загрузите этот пример проекта PNG Animation для xcode. Я также предоставляю библиотеку AVAnimator, оптимизированную версию с той же функциональностью, она поддерживает форматы Quicktime Animation и APNG, а также сжатие.
Вы можете использовать
CAKeyframeAnimation
для анимации серии изображений / воспроизведения изображений, как в фильме.
//Get UIImage array
NSMutableArray<UIImage *> *frames = [[NSMutableArray alloc] init];
[frames addObject:[UIImage imageNamed:@"1"]];
[frames addObject:[UIImage imageNamed:@"2"]];
[frames addObject:[UIImage imageNamed:@"3"]];
[frames addObject:[UIImage imageNamed:@"4"]];
[frames addObject:[UIImage imageNamed:@"5"]];
//Declare an array for animationSequenceArray
NSMutableArray *animationSequenceArray = [[NSMutableArray alloc] init];
//Prepare animation
CAKeyframeAnimation *animationSequence = [CAKeyframeAnimation animationWithKeyPath: @"contents"];
animationSequence.calculationMode = kCAAnimationDiscrete;
animationSequence.autoreverses = YES;
animationSequence.duration = 5.00; // Total Playing duration
animationSequence.repeatCount = HUGE_VALF;
for (UIImage *image in frames) {
[animationSequenceArray addObject:(id)image.CGImage];
}
animationSequence.values = animationSequenceArray;
//Prepare CALayer
CALayer *layer = [CALayer layer];
layer.frame = self.view.frame;
layer.masksToBounds = YES;
[layer addAnimation:animationSequence forKey:@"contents"];
[self.view.layer addSublayer:layer]; // Add CALayer to your desired view
Для анимации изображений в последовательности,
Сначала возьмите массив изображений, которые вам нужно воспроизвести.
Затем передайте этот массив анимации и все готово.
Well Объяснение Анимация в Iphone: серия изображений