Базовая анимация, анимирующая массив изображений - PullRequest
2 голосов
/ 11 августа 2011

Что я в основном хочу сделать, это отобразить последовательность изображений с высокой скоростью (60 в секунду), чтобы создать последовательность. Я собираюсь создать таймер и посмотреть, достаточно ли он быстр.

Я хочу отобразить массив изображений в моем приложении какао, используя анимацию (до 60 в секунду).

Вот анимация, которую я создал до сих пор:

- (CAAnimation*)imageAnimation;
{
    CGImageRef image1 = [self nsImageToCGImageRef:[NSImage imageNamed:@"1.png"]];
    CGImageRef image2 = [self nsImageToCGImageRef:[NSImage imageNamed:@"2.png"]];
    CGImageRef image3 = [self nsImageToCGImageRef:[NSImage imageNamed:@"3.png"]];

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

    NSArray *images = [NSArray arrayWithObjects:(id)image1, (id)image2, (id)image3, nil];

    [animation setValues:images];
    [animation setDuration:3.0];

    return animation;
}

где nsImageToCGImageRef - метод, который я определил в другом месте. Теперь я не уверен, куда идти, чтобы добавить эту анимацию в мои представления.

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Вы должны исследовать CVDisplayLink, что позволяет вам получать обратный вызов каждый раз, когда подсистема дисплея Mac собирается отобразить кадр.Это позволит вам отображать изображения со скоростью 60 кадров в секунду без пропущенных кадров, потому что API вызывает ваш код только при необходимости обновления.

Это означает, что вам не нужно беспокоиться о синхронизации таймера с дисплеем, иэто также означает, что вы не выполняете ненужную работу.Вы также можете выполнять такие действия, как обновление только для альтернативных обратных вызовов, чтобы снизить частоту кадров до 30 кадров в секунду, если код рисования медленный.

0 голосов
/ 12 августа 2011

После некоторых исследований и испытаний кажется, что лучше всего использовать вместо этого таймер и изменить изображение следующим доступным.

0 голосов
/ 11 августа 2011

Ну, для начала, вопрос недостаточно ясен.Вы можете перефразировать, так как вопрос не говорит о том, чего вы хотите достичь, и ничего не говорит о том, что вы сделали до сих пор с помощью кода.

CAKeyframeAnimation используется для указания значений свойства слоя во время анимации.

Вы создаете анимацию ключевого кадра с положением свойства;в этом случае вы должны указать значения положения слоя, который будет установлен во время анимации.Вы пытаетесь изменить изображения.Из того, что я понял из вашего кода, вы должны установить свойство содержимого вместо свойства animation со значениями изображений, но вы не получите плавную анимацию.Я не пробовал это сам, но, основываясь на теории, это то, что нужно.Ваш код работает вообще?Я так не думаю, как вам нужно, даже если это медленно?Пожалуйста, дайте мне знать, если изменение имени свойства "position" для сообщения animationWithKeyPath на "content" работает, даже если оно медленное?

Для этого вам понадобятся текстурированные атласы.Посмотрите на URL http://mysterycoconut.com/blog/2011/01/cag1/

Это может показать, что вам нужно, исходя из того, что я понял из вашего вопроса.

...