绿豆宝贝 发表于 2015-7-19 00:52:45

在泰泽/Tizen本机应用程序中的动画


在泰泽Tizen本机应用程序中的动画
简介本文将演示泰泽/Tizen本机应用程序中如何使用动画。 这篇文章的目的是提出了开发泰泽/Tizen GUI 本机应用程序所提供的可能性。 我们想把主题放在一个简洁的方式和使用大量的示例代码。 读这篇文章可以后所获得的知识用于游戏开发,以及在用户界面中执行有趣的效果。
这篇文章是针对那些有基本的了解,C 编程语言的开发人员创建的。 阅读这篇文章的开发人员应该有关于泰泽/Tizen本机应用程序生命周期的基本知识。 然而,它是不必要的知识来理解这里展示的范例。
在附加到这篇文章的示例应用程序,您可以看到使用所描述的方法进行的动画。 使用各种各样的缓动函数来修改动画物体的运动进行动画。
执行有很多机会结识动画泰本机应用程序中。 所有的方式来实现动画,在这篇文章介绍了基于执行动画步骤里面的回调函数。 在很多游戏中,使用从加速度计或陀螺仪的传感器的读数进行控制。 以下文章中介绍了这种方法。 你要记住回调应该用适当的频率调用或调用之间动画应该平稳的。 若要创建平滑动画可以使用称为 Ecore 动画的 EFL 库子集。 在本文稍后部分,您将学习有关它的详细信息。 一个好的做法是使用三角洲定时技术以消除速度显示动画,与当前的帧速率的变化相关联的波动。 这一点尤其重要,如果我们想要获得高精度的运动在我们的动画。
另一种方式进行动画处理的对象是时间的设置一个计时器,在指定间隔将触发动画更新功能。 它可能是一个好的解决方案,在种情况下,我们想要比当前的帧速率要慢的动画的地方。 这种类型的动画可以有用,当你想要在你的游戏使例如雪碧动画。 下面的代码演示如何注册回调:<font size="4">#define INTERVAL_IN_SECONDS 0.5

   /* callback function */
    static Eina_Bool
    cb_function(void *data)
    {
      /* do the animation step */
   
      return ECORE_CALLBACK_RENEW;
    }

    […]

    /* register the timer */
    ecore_timer_add(INTERVAL_IN_SECONDS, cb_function, data);</font>无限调用动画回调函数必须返回 ECORE_CALLBACK_RENEW。 您还可以取消该动画在任何时候通过返回值 ECORE_CALLBACK_CANCEL。
英语图书馆,其中基于 GUI 泰本机应用程序,包含称为 Ecore 动画师,开发以创建动画的一个子集。 有了这个工具,您可以创建一个回调将调用每次当您的程序将呈现一个框架。 下面的代码演示如何注册 Ecore 动画回调:<font size="4">/* callback function */
    static Eina_Bool
    cb_function(void *data)
    {
      /* do the animation step */
   
      return ECORE_CALLBACK_RENEW;
    }

    […]

    /* register the callback */
    ecore_animator_add(cb_function, data);</font>在 ecore_timer 的情况下,可以在任何时候,当一个回调函数返回的值从 ECORE_CALLBACK_CANCEL 停止动画。 Ecore 动画使你能够通过调用 ecore_animator_freeze() 来冻结随时动画。 在那之后,您可以通过调用 ecore_animator_thaw () 继续动画。<font size="4"> /* register the callback */
    Ecore_Animator *animator = ecore_animator_add(cb_function, data);
   
    […]
   
    /* Stop animation */
    Ecore_animator_freeze(animator);
   
    /* Play animation after freeze */
    Ecore_animator_thaw(animator); </font>也是动画的可能性设置我们的时间。 在这种情况下在回调函数的参数之一,我们收到有关在动画中位置的信息。 接收的值是一个浮点数从 0.0 到 1.0。 本文附带的示例应用程序使用所描述的方法。<font size="4"> /* animation time in seconds */
    #define ANIM_TIME 1.2
   
    […]

    /* callback function */
    static Eina_Bool
    cb_function (void *data, double position)
    {
            /* do the animation step */

             return EINA_TRUE;
    }

    […]

    /* register the timer */
    ecore_animator_timeline_add(ANIM_TIME, cb_function, data);</font>Ecore 动画还提供了一整套的缓动函数用来映射在动画中,基于 ecore_animator_pos_map() 函数内部的动画对象的位置的位置。 您可以轻松地执行的动画,例如对象加速或反弹。 此主题的详细的说明可以在这里找到。 在示例程序中已实现方式如下:<font size="4">/* animation time in seconds */
    #define ANIM_TIME 1.2
   
    […]
   
    int screen_width;
    int screen_height;
   
    […]
   
    static void
    evas_object_rotate(Evas_Object *object, double degree){
      Evas_Map *m;
      Evas_Coord x, y, w, h;
      m = evas_map_new(4);
      evas_object_geometry_get(object, &x, &y, &w, &h);
      evas_map_util_points_populate_from_object(m, object);
      evas_map_util_rotate(m, degree, x + (w / 2), y + (h / 2));
      evas_object_map_set(object, m);
      evas_object_map_enable_set(object, EINA_TRUE);
    }
   
    […]
   
    /* callback function */
    static Eina_Bool
    _do_animation(void *data, double pos)
    {
         double frame = pos;
         int x, y;
         frame = ecore_animator_pos_map(pos, animation_type, 0.0, 0.0);
         
          /* some mathematical calculations of new X and Y position
          X = …;
          Y = …;
          Double rotation_angle = …;
         */
   
          […]
   
         evas_object_rotate(data, rotation_angle );
   
         evas_object_move(data, x, y);
   
         return EINA_TRUE;
    }

    […]

    /* register the timer */
    ecore_animator_timeline_add(ANIM_TIME, _do_animation, data);</font>此动画更改位置的对象和它的自转。 动画的太空飞船的移动量依据相切轨迹。 根据变量 animation_type 的值,一个不同的位置被映射每次和动画的对象加快、 减慢或移动均匀。
摘要在这篇文章中,我们提出了如何创建的动画在特定的时间间隔调用步骤。 我们还描述了步骤执行沿呈现使用 ecore_animator 的每个帧的动画。此外,这篇文章演示如何停止和恢复动画以及如何实施是内置的缓动函数 EFL 图书馆。 如果你想要探索更多的EFL,你应该查阅相关的文档。
文件附件:
animation.zip


页: [1]
查看完整版本: 在泰泽/Tizen本机应用程序中的动画