Core Animation Part I: Introduction 核心动画框架入门

原文:


https://www.invasivecode.com/weblog/core-animation-part-i-warm-up/


毫无疑问,Core Animation(核心动画框架)是我最喜欢的框架之一。因为它为你提供了一些强有力的工具来实现那些你想要创造的东西。


在以前的帖子里,我曾经展示过一点如何使用CoreGraphics的技巧,现在的话是时候给你们看看如何使用CoreAnimation框架了。这样你们就能结合这两个框架搞一些好看的东西出来。


你会发现用这个框架做简单的事情是很容易的,但是当你想制作非常复杂的动画时,你需要了解一些几何和数学。然而,CACore Animation)的目标不是让你在你的接口搞出一堆复杂和混乱的动画。相反,从可用性的观点来说你应该使用CA提高你的应用程序的可用性,并使其更直观。我想展示如何倾尽这个框架的全部力量。但别担心,我会一步一步走。


 


所以,首先让我们从一些定义开始。什么是核心动画?苹果文件说:


suǒshǒuxiānràngmencóngxiēdìngkāishǐshénmeshìxīndònghuàpíngguǒwénjiànshuō



核心动画是把图形的绘制,投影,和动画集合到一起的一个Objective-C类的集合。它使用先进的合成效果提供了流畅的动画,于此同时保留了一个抽象的layer,这对使用Application KitCocoa Touch视图架构的开发者来说是很熟悉的。


 


我相信你理解啥是图形渲染,投影和动画,但,他们真正的意思是什么?分层抽象又是啥?在本教程中,我们会找出答案。我希望你会喜欢它。


在我们开始之前,我想提一些学习这个框架的可用资源。首先,你肯定有苹果的文档吧,更确切地说,你应该寻找:


Core AnimationProgramming Guide; and


Core AnimationCookbook


另一个资源是对于CA的一个快速启动demo,但它或多或少有一些和编程指南相同的风格。所以,再次强调一下,它是有用的,但只有你已经知道了一些核心动画的时候。


 


基本视图动画


iOS SDK自带的一些方法,使动画很容易实现


看一看UIView类。有一堆按动画视图和动画视图块对象,您可以使用此范围的方法。所有的方法列出动画视图很旧,苹果在iOS 4不使用它们。所以,我不会告诉你在这里他们如何工作。从iOS 4,你应该使用上市的部分动画视图块对象下面的方法。

iOSSDKdàidexiēfāngshǐ使dònghuàhěnróngshíxiànzàiUIViewlèikànyǒuduīàndònghuàshìdònghuàshìkuàiduìxiàngnínshǐ使yòngfànwéidefāngsuǒyǒudefānglièchūdònghuàshìhěnjiùpíngguǒzàiiOS4shǐ使yòngmensuǒhuìgàozàizhèmengōngzuòcóngiOS4yīnggāishǐ使yòngshàngshìdefendònghuàshìkuàiduìxiàngxiàmiàndefāng

The following piece of code demonstrates how you use these methods. Let’s start from the simplest method.

下面的代码演示了如何使用这些方法。让我们从最简单的方法开始。

xiàmiàndedàiyǎnshìleshǐ使yòngzhèxiēfāngràngmencóngzuìjiǎndāndefāngkāishǐ

We are going to move a view from its current position (not specified in the following animation block) to a final position (200, 300).

我们将从其当前位置(在下面的动画块中指定的位置)移动一个视图(200,300)。

menjiāngcóngdāngqiánwèizhizàixiàmiàndedònghuàkuàizhōngzhǐdìngdewèizhidòngshì200300

Swift

2
3
4
[ UIView animateWithDuration : 3.0 animations : ^ {
     [ myView setCenter : CGMakePoint ( 200 , 300 ) ] ;
} ;
 

wēi

1


2


èr

3


sān

4


[UIView animateWithDuration:3.0 animations:^{


UIViewanimatewithduration3dònghuà^{

[myView setCenter:CGMakePoint(200, 300)];


[deguāndiǎnsetcentercgmakepoint200300]

};


}

I am assuming I have a view (myView) placed at (20, 30). CA uses the upper-left corner of the screen as the origin of the reference system with the x growing from left to right and y growing from up to down. So, the upper-left point of the screen has coordinates (0, 0) and it represents the coordinates system origin.

我假设我有一个观点(我的观点)放在(20,30)。可以使用屏幕的左上角作为参考系的起源,从左至右,从上到下,从左至右增长。因此,屏幕的左上角有坐标(0,0),它表示坐标系原点。

jiǎshèyǒuguāndiǎndeguāndiǎnfàngzài2030shǐ使yòngpíngdezuǒshàngjiǎozuòwéicānkǎodeyuáncóngzuǒzhìyòucóngshàngdàoxiàcóngzuǒzhìyòuzēngzhǎngyīnpíngdezuǒshàngjiǎoyǒuzuòbiāo00biǎoshìzuòbiāoyuándiǎn

The previous lines of code set the duration of the animation and the final position of the myView view.

先前的几行代码设置动画的持续时间和我的观点看法的最终位置。

xiānqiándehángdàishèzhìdònghuàdechíshíjiāndeguāndiǎnkàndezuìzhōngwèizhi

If you want to animate more than a view property at the same time (for example, view position, opacity and size), you can do it just setting the new value of these properties in the animations bloc. The drawback is the different properties will animate simultaneously. Even if you create a sequence of code blocks similar to the previous one and each of them setting a different view property, the animation will be fired at the same run-loop cycle (or maybe during two consecutive run-loops), but you will not be able to visually discriminate them. This inconvenient behavior is solved used more complex techniques.

如果你想在同一时间(例如,视图位置,不透明度和大小)的视图属性的动画,你可以做它只是设置这些属性在动画集团的新价值。缺点是不同的属性将同时动画。即使你创建一个类似于前一个序列的代码块,并且每一个设置不同的视图属性,动画将被解雇在同一个运行循环周期(或在2个连续运行循环),但你将无法直观地区分它们。这种不方便的行为解决了使用更复杂的技术。

guǒxiǎngzàitóngshíjiānshìwèizhitòumíngxiǎodeshìshǔxìngdedònghuàzuòzhǐshìshèzhìzhèxiēshǔxìngzàidònghuàtuándexīnjiàzhíquēdiǎnshìtóngdeshǔxìngjiāngtóngshídònghuàshǐ使chuàngjiànlèiqiánlièdedàikuàibìngqiěměishèzhìtóngdeshìshǔxìngdònghuàjiāngbèijiězàitóngyùnxíngxúnhuánzhōuhuòzài2liányùnxíngxúnhuándànjiāngzhíguāndefēnmenzhèzhǒngfāngbiàn便dexíngwéijiějuéleshǐ使yònggèngdeshù

Now, most of the time, this type of animations is enough to make your interface look nicer and since it is very easy to implement, you can really use it whenever you need without writing too much code.

现在,大多数的时间,这种类型的动画是足够的,使你的界面看起来更好,因为它是非常容易实现,你可以真正使用它,只要你需要不写太多的代码。

xiànzàiduōshùdeshíjiānzhèzhǒnglèixíngdedònghuàshìgòudeshǐ使dejièmiànkànláigènghǎoyīnwèishìfēichángróngshíxiànzhēnzhèngshǐ使yòngzhǐyàoyàoxiětàiduōdedài

Let’s make a concrete example with the Animation Views. So, launch Xcode and create a view-based iPhone project. Name it, BasicAnimation. In the BasicAnimationViewController.xib file, add on the main view a small view 100 x 100 positioned at the point (130, 130) and change its background to red. You should get something like this:

让我们用动画的观点做一个具体的例子。因此,启动Xcode,创建一个基于iPhone的项目视图。它的名字,basicanimation。在basicanimationviewcontroller.xib文件,添加在主视图的小角度100×100定位在点(130,130)并改变其背景为红色。你应该得到这样的东西:

ràngmenyòngdònghuàdeguāndiǎnzuòdeziyīndòngXcodechuàngjiàniPhonedexiàngshìdemíngzibasicanimationzàibasicanimationviewcontroller.xibwénjiàntiānjiāzàizhǔshìdexiǎojiǎo100×100dìngwèizàidiǎn130130bìnggǎibiànbèijǐngwéihóngyīnggāidàozhèyàngdedōngxi西

In the BasicAnimationViewController class, add an outlet of type UIView and connect it to the red view you created. Let’s also add an IBAction and name it fire. Now, add the following code to the button action:

在basicanimationviewcontroller类,添加型UIView出口连接到你创建的红色视野。让我们添加一个ibaction命名为火。现在,在按钮操作中添加以下代码

zàibasicanimationviewcontrollerlèitiānjiāxíngUIViewchūkǒuliánjiēdàochuàngjiàndehóngshìràngmentiānjiāibactionmìngmíngwéihuǒxiànzàizàiànniǔcāozuòzhōngtiānjiāxiàdài

Swift

[ UIView animateKeyframesWithDuration : 3.0
                               delay : 0.0
     options : ( UIViewAnimationCurveEaseInOut | UIViewAnimationOptionAutoreverse )
                           animations : ^ {
                               [ self . movingView setCenter : CGPointMake ( 300 , 300 ) ] ;
                           }
                           completion : nil ] ;

xuǎnxiànguiviewanimationcurveeaseinout|uiviewanimationoptionautoreverse

animations:^{


dònghuà{

[self.movingView setCenter:CGPointMake(300, 300)];


[self.movingviewsetcentercgpointmake300300]

}


}

completion:nil];


wánchéng

Build and run the project. When the app launches, press the button and you will see the red view moving to bottom left of the screen and then, moving back. You will also notice that, once the animation is completed, the view jump to its final position. Nothing is wrong, since that’s the position we specified in the previous code. If you want the view to stop to its initial position, you have to set the view position to its initial value.

建设和运行该项目。当应用程序启动,按按钮,你会看到红色的视图移动到屏幕底部的左,然后,移动。你也会注意到,一旦动画完成,视图跳转到它的最后位置。没有什么是错误的,因为这是我们在前面的代码中指定的位置。如果你希望视图停留到初始位置,你必须将视图位置设置为它的初始值。

jiànshèyùnxínggāixiàngdāngyìngyòngchéngdòngànànniǔhuìkàndàohóngdeshìdòngdàopíngdezuǒránhòudònghuìzhùdàodàndònghuàwánchéngshìtiàozhuǎndàodezuìhòuwèizhiméiyǒushénmeshìcuòdeyīnwèizhèshìmenzàiqiánmiàndàizhōngzhǐdìngdewèizhiguǒwàngshìtíngliúdàochūshǐwèizhijiāngshìwèizhishèzhìwéidechūshǐzhí

Now, try to experiment a little bit with the different methods provided in UIView. I am sure you will not understand everything, but it does not matter at the moment. Later you will master everything.

现在,试着用不同的方法提供了UIView的一点点实验。我相信你会不理解每一件事,但那一刻也没有关系。以后你会掌握一切。

xiànzàishìzheyòngtóngdefānggōngleUIViewdediǎndiǎnshíyànxiāngxìnhuìjiěměijiànshìdànméiyǒuguānxihòuhuìzhǎngqiè

Next time

下一次

xià

Next time, we will give a look to a different type of animation. To make things more flexible, Apple provided us with a bunch of classes collected all together in the Core Animation framework.

下一次,我们会给一个看一个不同类型的动画。为了使事情变得更灵活,苹果提供了一系列的类收集了所有的核心动画框架。

你可能感兴趣的:(动画,animation,core,ca)