• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

CAViewAnimation(动画实现)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

类说明
CAViewAnimation是CrossApp中提供实现动画效果的类,它的对外提供一系列的静态函数供使用者调用,通过对CAViewAnimation的属性设置,及对View属性的改变,来定制你所需要的动画效果。CAViewAnimation的使用方法类似于IOS开发中的Core Animation


CAViewAnimation 方法(点击查看方法介绍)

方法说明
beginAnimations表示动画开始
commitAnimations表示动画结束
setAnimationDuration动画所用的时间,默认为0.2秒
setAnimationDelay动画延时多长时间后开始播放,默认为0秒
setAnimationCurve设置动画的曲线方式
setAnimationRepeatCount动画的重复次数,默认1次
setAnimationRepeatAutoreverses画结束后,是否执行反向动作,默认为false
setAnimationWillStartSelector动画开始时,调用SEL_CAViewAnimation0函数,SEL_CAViewAnimation0函数是一个无参数的函数
setAnimationWillStartSelector动画开始时,调用SEL_CAViewAnimation2函数,SEL_CAViewAnimation2函数是一个有两个参数的函数,分别是const std::string& animationID和void* context
setAnimationDidStopSelector动画结束时,调用SEL_CAViewAnimation0函数,SEL_CAViewAnimation0函数是一个无参数的函数
setAnimationDidStopSelector动画结束时,调用SEL_CAViewAnimation2函数,SEL_CAViewAnimation2函数是一个有两个参数的函数,分别是const std::string& animationID和void* context
removeAnimations根据animationID移除对应的动画
removeAnimationsWithView移除对应的CAView的动画
setAnimationsEnabled设置是否禁用动画效果
areAnimationsEnabled动画是否被禁用
areBeginAnimations动画是否开始执行
areBeginAnimationsWithID对应的animationID的动画是否开始执行


基本用法

CALabel* label = CALabel::createWithCenter(DRect(winRect.size.width*0.5, winRect.size.height*0.5-270, winRect.size.width, 200));
 
label->setTextAlignment(CATextAlignmentCenter);
label->setVerticalTextAlignmet(CAVerticalTextAlignmentCenter);
label->setFontSize(_px(72));
label->setText("Hello World!");
label->setColor(CAColor_white);
 
this->getView()->insertSubview(label, 1);
 
/****************下面是ViewAnimation部分************************/
CAViewAnimation::beginAnimations("animation1", NULL);//开始
 
//CAView属性的改变:缩放、位置、旋转、透明度等等.
label->setScale(5);
 
CAViewAnimation::commitAnimations();//结束
这是CAViewAnimation最基本的用法,beginAnimations和commitAnimations函数都是成对出现的,上一段代码就能够实现让CAView放大5倍的动画效果,虽然我们没有设置它的时间,但默认时间为0.2秒

CAViewAnimation::beginAnimations("animation1", NULL);//开始
 
CAViewAnimation::setAnimationDuration(0.8);//设置时间
CAViewAnimation::setAnimationDelay(1.0);//设置延时时间
 
/*
*CAView属性的改变:缩放、位置、旋转、透明度等等.
*例如:label->setScale(5);
*/
 
CAViewAnimation::setAnimationCurve(CAViewAnimationCurveEaseInOut);//时间曲线
CAViewAnimation::setAnimationRepeatAutoreverses(true);//是否执行反动作
CAViewAnimation::setAnimationRepeatCount(2);//反动作执行次数
 
CAViewAnimation::commitAnimations();//结束

我们可以根据自己的需求,定制更多的属性来实现我们想要的动画效果。这是CAViewAnimation最基本的用法,beginAnimations和commitAnimations函数都是成对出现的,上一段代码就能够实现让CAView放大5倍的动画效果,虽然我们没有设置它的时间,但默认时间为0.2秒


动画的嵌套

CAViewAnimation::beginAnimations("animation1", NULL);
CAViewAnimation::setAnimationDuration(0.8);//设置animation1时间
 
//1部分的动画
CAViewAnimation::beginAnimations("animation2", NULL);
CAViewAnimation::setAnimationDuration(0.8);//设置animation2时间
 
//2部分的动画
CAViewAnimation::commitAnimations();//结束1
CAViewAnimation::commitAnimations();//结束2

多个CAViewAnimation之间可以嵌套使用,可以设置不同的时间、延时、反函数及回调等。当一定要注意View属性改变的位置,要写在对应的嵌套层级。


监听与回调

CAViewAnimation::beginAnimations("animation1", NULL);//开始
 
//开始回调,在Animation开始时调用
CAViewAnimation::setAnimationWillStartSelector(this, CAViewAnimation0_selector(FirstViewController::callbackStartAnimation0));
 
/*
*CAView属性的改变:缩放、位置、旋转、透明度等等.
*例如:label->setScale(5);
*/
 
//结束回调,在Animation结束时调用
CAViewAnimation::setAnimationDidStopSelector(this, CAViewAnimation2_selector(FirstViewController::callbackStopAnimation2));
 
CAViewAnimation::commitAnimations();//结束
开始回调函数如下
void FirstViewController::callbackStartAnimation0()
{
    CCLog("callbackStartAnimation0-->");
}
 
结束回调函数如下
void FirstViewController::callbackStopAnimation2(const std::string& animationID , void* context)
{
    //输出animationID
    CCLog("animationID:%s",animationID.c_str());
}

注意:回调的第二个参数“void* context”就是CAViewAnimation::beginAnimations("animation1", NULL);传入的第二个参数(我们这里传的是NULL),它本身是一个void指针类型,使用时候需要类型转换。开始回调函数如下


例如:

    CALabel* label = CALabel::createWithCenter(DRect(winRect.size.width*0.5, winRect.size.height*0.5-270, winRect.size.width, 200));
     
    this->getView()->insertSubview(label, 1);
     
    CAViewAnimation::beginAnimations("animation1", lable);
     
    CAViewAnimation::setAnimationDuration(0.8);//设置时间
     
    label->setScale(5);
     
    CAViewAnimation2_selector(FirstViewController::callbackStopAnimation2));//结束回调,在Animation结束时调用
     
    CAViewAnimation::commitAnimations();//结束
     
    回调:
    void FirstViewController::callbackStopAnimation2(const std::string& animationID , void* context)
    {
        CALabel* label = (CALabel*)context;
         
         
        if (label) {
            label->setRotation(180);
        }
    }
    


    这个样我们就可以获得Label并改变其属性,当然我们可以传入其他类型的参数。

    组合动画
    1同时执行

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

    2顺序执行

    方法一:延时

    利用延时,在上一个Animation时间结束后,再执行下一个Animation。

    //第一个Animation
    CAViewAnimation::beginAnimations("", NULL);
     
    CAViewAnimation::setAnimationDuration(1.8);
     
    label->setRotation(180);
     
    CAViewAnimation::commitAnimations();   
     
    //第二个Animation
    CAViewAnimation::beginAnimations("", NULL);
     
    CAViewAnimation::setAnimationDuration(2.8);
    CAViewAnimation::setAnimationDelay(1.8);//延时1.8秒
     
    label->setScale(5);
     
    CAViewAnimation::commitAnimations();
    

    方法二:回调

    利用Animation的介绍回调

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

    鲜花

    握手

    雷人

    路过

    鸡蛋
    该文章已有0人参与评论

    请发表评论

    全部评论

    专题导读
    上一篇:
    宏定义发布时间:2022-02-02
    下一篇:
    http请求网络图发布时间:2022-02-02
    热门推荐
    热门话题
    阅读排行榜

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap