现在的位置: 首页 > 综合 > 正文

chrome之view之animate

2013年03月13日 ⁄ 综合 ⁄ 共 1097字 ⁄ 字号 评论关闭

chrome的动画机制

 

动画首先需要创建一个容器,负责时间调度,这里是AnimationContainer

这个类里面使用的是base::RepeatingTimer来开设置settimer,然后回调

到run()

timer_.Start(min_timer_interval_, this, &AnimationContainer::Run);

run()

{

  Elements elements = elements_;

 

    for(Elements::const_iterator i=elements.begin(); i!=elements.end(); ++i)

    {

        // 确保元素是合法的.

        if(elements_.find(*i) != elements_.end())

        {

            (*i)->Step(current_time);

        }

    }

run里循环调用所有的元素,并调用他们的step方法,

(*i)->Step(current_time);

这些element就是具体的动画对象了,比如LinearAnimation,multiAnimation之类的

这里会根据消耗的时间占总时间的比例来设置state_,设置了以后再调用

   delegate()->AnimationProgressed(this);来执行具体的绘画动作

一个流程就完成了

 

实例来个

首先一个类,需要继承animate::deletegate才有了可以接受>AnimationProgressed的能力

然后呢,这个类需要设置一个AnimationContainer,new也好,使用现成的也好

有了时间管理的类,还需要创建出具体的动画行为,比如SlideAnimation,这个类需要设置container

然后就可以调用animation的show->start->container.start->timer.settimer了

container.start的时候会将这个animation加到elements里面

然后时间到了,就会ontimer->container.run->element.step->delegate.>AnimationProgressed

 

 

还是不习惯c++的这种写法,一点功能需要这么多类,还需要这么多的组合,你套我,我套你,感觉很乱

但是这是google的代码,应该是高水准的了

  deletgate包含container,还包含里具体的animation,然后container和animation也是互相拥有,执行过程也是

一大堆栈调用,实际运行发现这个动画也是比较占用资源的

 

抱歉!评论已关闭.