请选择 进入手机版 | 继续访问电脑版
查看: 1613|回复: 1

[教程] [无脑码农CrossApp笔记]动画CAVieAnimation

[复制链接]
最佳答案
0 
无脑码农 发表于 2015-7-30 10:51:19 | 显示全部楼层 |阅读模式
本帖最后由 无脑码农 于 2015-9-6 11:04 编辑

CAViewAnimation

版本:CrossApp 1.19.0

作者:无脑码农

简介

CAViewAnimation是CrossApp中提供实现动画效果的类,它的对外提供一系列的静态函数供使用者调用,通过对CAViewAnimation的属性设置,及对View属性的改变,来定制你所需要的动画效果。CAViewAnimation的使用方法类似于IOS开发中的Core Animation
常用函数
  1. /*
  2. *beginAnimations:表示动画开始
  3. *animationID:动画标识符
  4. *context:用于回调函数的参数,一般为NULL
  5. */
  6. static void beginAnimations(const std::string& animationID, void* context);

  7. /*
  8. *commitAnimations:表示动画结束
  9. */
  10. static void commitAnimations();

  11. /*
  12. *setAnimationDuration:动画所用的时间,默认为0.2秒
  13. */
  14. static void setAnimationDuration(float duration);// default(0.2)

  15. /*
  16. *setAnimationDelay:动画延时多长时间后开始播放,默认为0秒
  17. */
  18. static void setAnimationDelay(float delay);// default(0)

  19. /*
  20. *setAnimationCurve:设置动画的曲线方式
  21. *(就是动画的总体变化的时间曲线:开始快最后慢,开始慢最后快,最后慢,均匀线性)
  22. *CAViewAnimationCurveLinear:均匀线性
  23. *CAViewAnimationCurveEaseOut:结束时缓慢
  24. *CAViewAnimationCurveEaseIn:开始时缓慢         
  25. *CAViewAnimationCurveEaseInOut:开始和结束时都慢,中间快
  26. */
  27. static void setAnimationCurve(const CAViewAnimationCurve& curve);// default(CAViewAnimationCurveLinear)

  28. /*
  29. *setAnimationRepeatCount:动画的重复次数,默认1次
  30. */
  31. static void setAnimationRepeatCount(float repeatCount);// default(1.0)

  32. /*
  33. *setAnimationRepeatAutoreverses:动画结束后,是否执行反向动作,默认为false
  34. */
  35. static void setAnimationRepeatAutoreverses(bool repeatAutoreverses);// default(false)

  36. /*
  37. *setAnimationWillStartSelector:动画开始时,调用SEL_CAViewAnimation0函数,SEL_CAViewAnimation0函数是一个无参数的函数
  38. */
  39. static void setAnimationWillStartSelector(CAObject* target, SEL_CAViewAnimation0 selector);
  40. /*
  41. *setAnimationWillStartSelector:动画开始时,调用SEL_CAViewAnimation2函数,SEL_CAViewAnimation2函数是一个有两个参数的函数,分别是const std::string& animationID和void* context
  42. */   
  43. static void setAnimationWillStartSelector(CAObject* target, SEL_CAViewAnimation2 selector);
  44. /*
  45. *setAnimationDidStopSelector:动画结束时,调用SEL_CAViewAnimation0函数,SEL_CAViewAnimation0函数是一个无参数的函数
  46. */   
  47. static void setAnimationDidStopSelector(CAObject* target, SEL_CAViewAnimation0 selector);
  48. /*
  49. *setAnimationDidStopSelector:动画结束时,调用SEL_CAViewAnimation2函数,SEL_CAViewAnimation2函数是一个有两个参数的函数,分别是const std::string& animationID和void* context
  50. */  
  51. static void setAnimationDidStopSelector(CAObject* target, SEL_CAViewAnimation2 selector);

  52. /*
  53. *removeAnimations:根据animationID移除对应的动画
  54. */
  55. static void removeAnimations(const std::string& animationID);

  56. /*
  57. *removeAnimationsWithView:移除对应的CAView的动画
  58. */
  59. static void removeAnimationsWithView(CAView* view);
  60. /*
  61. *setAnimationsEnabled:设置是否禁用动画效果
  62. */
  63. static void setAnimationsEnabled(bool enabled);
  64. /*
  65. *areAnimationsEnabled:动画是否被禁用
  66. */   
  67. static bool areAnimationsEnabled();
  68. /*
  69. *areBeginAnimations:动画是否开始执行
  70. */
  71. static bool areBeginAnimations();
  72. /*
  73. *areBeginAnimationsWithID:对应的animationID的动画是否开始执行
  74. */   
  75. static bool areBeginAnimationsWithID(const std::string& animationID);
复制代码
基本用法
  1. CALabel* label = CALabel::createWithCenter(CCRect(winRect.size.width*0.5, winRect.size.height*0.5-270, winRect.size.width, 200));
  2. label->setTextAlignment(CATextAlignmentCenter);
  3. label->setVerticalTextAlignmet(CAVerticalTextAlignmentCenter);
  4. label->setFontSize(_px(72));
  5. label->setText("Hello World!");
  6. label->setColor(CAColor_white);
  7. this->getView()->insertSubview(label, 1);

  8. /****************下面是ViewAnimation部分************************/
  9. CAViewAnimation::beginAnimations("animation1", NULL);//开始
  10. //CAView属性的改变:缩放、位置、旋转、透明度等等.
  11. label->setScale(5);
  12. CAViewAnimation::commitAnimations();//结束
复制代码
这是CAViewAnimation最基本的用法,beginAnimations和commitAnimations函数都是成对出现的,上一段代码就能够实现让CAView放大5倍的动画效果,虽然我们没有设置它的时间,但默认时间为0.2秒
  1. CAViewAnimation::beginAnimations("animation1", NULL);//开始
  2. CAViewAnimation::setAnimationDuration(0.8);//设置时间
  3. CAViewAnimation::setAnimationDelay(1.0);//设置延时时间
  4. /*
  5. *CAView属性的改变:缩放、位置、旋转、透明度等等.
  6. *例如:label->setScale(5);
  7. */
  8. CAViewAnimation::setAnimationCurve(CAViewAnimationCurveEaseInOut);//时间曲线
  9. CAViewAnimation::setAnimationRepeatAutoreverses(true);//是否执行反动作
  10. CAViewAnimation::setAnimationRepeatCount(2);//反动作执行次数
  11. CAViewAnimation::commitAnimations();//结束
复制代码
我们可以根据自己的需求,定制更多的属性来实现我们想要的动画效果。

动画的嵌套
  1. CAViewAnimation::beginAnimations("animation1", NULL);
  2. CAViewAnimation::setAnimationDuration(0.8);//设置animation1时间
  3. //1部分的动画
  4. CAViewAnimation::beginAnimations("animation2", NULL);
  5. CAViewAnimation::setAnimationDuration(0.8);//设置animation2时间
  6. //2部分的动画
  7. CAViewAnimation::commitAnimations();//结束1
  8. CAViewAnimation::commitAnimations();//结束2
复制代码
多个CAViewAnimation之间可以嵌套使用,可以设置不同的时间、延时、反函数及回调等。当一定要注意View属性改变的位置,要写在对应的嵌套层级。

监听与回调
  1. CAViewAnimation::beginAnimations("animation1", NULL);//开始
  2. CAViewAnimation::setAnimationWillStartSelector(this, CAViewAnimation0_selector(FirstViewController::callbackStartAnimation0));//开始回调,在Animation开始时调用
  3. /*
  4. *CAView属性的改变:缩放、位置、旋转、透明度等等.
  5. *例如:label->setScale(5);
  6. */
  7. CAViewAnimation::setAnimationDidStopSelector(this, CAViewAnimation2_selector(FirstViewController::callbackStopAnimation2));//结束回调,在Animation结束时调用
  8. CAViewAnimation::commitAnimations();//结束
复制代码
开始回调函数如下
  1. void FirstViewController::callbackStartAnimation0()
  2. {
  3.     CCLog("callbackStartAnimation0-->");
  4. }
  5. 结束回调函数如下

  6. void FirstViewController::callbackStopAnimation2(const std::string& animationID , void* context)
  7. {
  8.     //输出animationID
  9.     CCLog("animationID:%s",animationID.c_str());
  10. }
复制代码
注意:回调的第二个参数“void* context”就是CAViewAnimation::beginAnimations("animation1", NULL);传入的第二个参数(我们这里传的是NULL),它本身是一个void指针类型,使用时候需要类型转换。

例如:
  1. CALabel* label = CALabel::createWithCenter(CCRect(winRect.size.width*0.5, winRect.size.height*0.5-270, winRect.size.width, 200));
  2. this->getView()->insertSubview(label, 1);
  3. CAViewAnimation::beginAnimations("animation1", lable);
  4. CAViewAnimation::setAnimationDuration(0.8);//设置时间
  5. label->setScale(5);
  6. CAViewAnimation2_selector(FirstViewController::callbackStopAnimation2));//结束回调,在Animation结束时调用
  7. CAViewAnimation::commitAnimations();//结束
  8. 回调:

  9. void FirstViewController::callbackStopAnimation2(const std::string& animationID , void* context)
  10. {
  11.     CALabel* label = (CALabel*)context;
  12.     if (label) {
  13.         label->setRotation(180);
  14.     }
  15. }
复制代码
这个样我们就可以获得Label并改变其属性,当然我们可以传入其他类型的参数。

组合动画
1同时执行

默认情况下,CAView的属性变化写在一对beginAnimations()和commitAnimations()直接,这些所有的变化将是同时执行。

2顺序执行

方法一:延时

利用延时,在上一个Animation时间结束后,再执行下一个Animation。
  1. //第一个Animation
  2. CAViewAnimation::beginAnimations("", NULL);
  3. CAViewAnimation::setAnimationDuration(1.8);
  4. label->setRotation(180);
  5. CAViewAnimation::commitAnimations();   
  6. //第二个Animation
  7. CAViewAnimation::beginAnimations("", NULL);
  8. CAViewAnimation::setAnimationDuration(2.8);
  9. CAViewAnimation::setAnimationDelay(1.8);//延时1.8秒
  10. label->setScale(5);
  11. CAViewAnimation::commitAnimations();
复制代码
方法二:回调

利用Animation的介绍回调
  1. CAViewAnimation::beginAnimations("animation1", NULL);//开始
  2. /*
  3. *CAView属性的改变:缩放、位置、旋转、透明度等等.
  4. *例如:label->setScale(5);
  5. */
  6. CAViewAnimation::setAnimationDidStopSelector(this, CAViewAnimation0_selector(FirstViewController::callbackStopAnimation0));//结束回调,在Animation结束时调用
  7. CAViewAnimation::commitAnimations();//结束
  8. 在回调函数里实现另一个Animation

  9. void FirstViewController::callbackStopAnimation0()
  10. {
  11.     CAViewAnimation::beginAnimations("NextAnimation", NULL);//开始
  12.     /*
  13.     *CAView属性的改变:缩放、位置、旋转、透明度等等.
  14.     *例如:label->setRotation(180);
  15.     */
  16.     CAViewAnimation::commitAnimations();//结束
  17. }
复制代码

CAViewAnimation.pdf (167.82 KB, 下载次数: 41)
最佳答案
0 
mr.jcw 发表于 2015-7-30 11:23:46 | 显示全部楼层
赞一个赞一个赞一个赞一个赞一个赞一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐阅读 More>

© 2001-2015 9秒社团

合作伙伴

公司简介 | 联系方式
COPYRIGHT©2015 ZHONGQINGLONGTU NETWORK CO.LTD ALL RIGHTS RESERVED.ICP备11023195号-4
北京中清龙图网络技术有限公司
返回顶部 返回列表