CAViewAnimation(動(dòng)畫(huà)實(shí)現(xiàn))

2018-09-08 18:07 更新

類(lèi)說(shuō)明
CAViewAnimation是CrossApp中提供實(shí)現(xiàn)動(dòng)畫(huà)效果的類(lèi),它的對(duì)外提供一系列的靜態(tài)函數(shù)供使用者調(diào)用,通過(guò)對(duì)CAViewAnimation的屬性設(shè)置,及對(duì)View屬性的改變,來(lái)定制你所需要的動(dòng)畫(huà)效果。CAViewAnimation的使用方法類(lèi)似于IOS開(kāi)發(fā)中的Core Animation


CAViewAnimation 方法(點(diǎn)擊查看方法介紹)

方法說(shuō)明
beginAnimations表示動(dòng)畫(huà)開(kāi)始
commitAnimations表示動(dòng)畫(huà)結(jié)束
setAnimationDuration動(dòng)畫(huà)所用的時(shí)間,默認(rèn)為0.2秒
setAnimationDelay動(dòng)畫(huà)延時(shí)多長(zhǎng)時(shí)間后開(kāi)始播放,默認(rèn)為0秒
setAnimationCurve設(shè)置動(dòng)畫(huà)的曲線(xiàn)方式
setAnimationRepeatCount動(dòng)畫(huà)的重復(fù)次數(shù),默認(rèn)1次
setAnimationRepeatAutoreverses畫(huà)結(jié)束后,是否執(zhí)行反向動(dòng)作,默認(rèn)為false
setAnimationWillStartSelector動(dòng)畫(huà)開(kāi)始時(shí),調(diào)用SEL_CAViewAnimation0函數(shù),SEL_CAViewAnimation0函數(shù)是一個(gè)無(wú)參數(shù)的函數(shù)
setAnimationWillStartSelector動(dòng)畫(huà)開(kāi)始時(shí),調(diào)用SEL_CAViewAnimation2函數(shù),SEL_CAViewAnimation2函數(shù)是一個(gè)有兩個(gè)參數(shù)的函數(shù),分別是const std::string& animationID和void* context
setAnimationDidStopSelector動(dòng)畫(huà)結(jié)束時(shí),調(diào)用SEL_CAViewAnimation0函數(shù),SEL_CAViewAnimation0函數(shù)是一個(gè)無(wú)參數(shù)的函數(shù)
setAnimationDidStopSelector動(dòng)畫(huà)結(jié)束時(shí),調(diào)用SEL_CAViewAnimation2函數(shù),SEL_CAViewAnimation2函數(shù)是一個(gè)有兩個(gè)參數(shù)的函數(shù),分別是const std::string& animationID和void* context
removeAnimations根據(jù)animationID移除對(duì)應(yīng)的動(dòng)畫(huà)
removeAnimationsWithView移除對(duì)應(yīng)的CAView的動(dòng)畫(huà)
setAnimationsEnabled設(shè)置是否禁用動(dòng)畫(huà)效果
areAnimationsEnabled動(dòng)畫(huà)是否被禁用
areBeginAnimations動(dòng)畫(huà)是否開(kāi)始執(zhí)行
areBeginAnimationsWithID對(duì)應(yīng)的animationID的動(dòng)畫(huà)是否開(kāi)始執(zhí)行


基本用法

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);//開(kāi)始
 
//CAView屬性的改變:縮放、位置、旋轉(zhuǎn)、透明度等等.
label->setScale(5);
 
CAViewAnimation::commitAnimations();//結(jié)束
這是CAViewAnimation最基本的用法,beginAnimations和commitAnimations函數(shù)都是成對(duì)出現(xiàn)的,上一段代碼就能夠?qū)崿F(xiàn)讓CAView放大5倍的動(dòng)畫(huà)效果,雖然我們沒(méi)有設(shè)置它的時(shí)間,但默認(rèn)時(shí)間為0.2秒

CAViewAnimation::beginAnimations("animation1", NULL);//開(kāi)始
 
CAViewAnimation::setAnimationDuration(0.8);//設(shè)置時(shí)間
CAViewAnimation::setAnimationDelay(1.0);//設(shè)置延時(shí)時(shí)間
 
/*
*CAView屬性的改變:縮放、位置、旋轉(zhuǎn)、透明度等等.
*例如:label->setScale(5);
*/
 
CAViewAnimation::setAnimationCurve(CAViewAnimationCurveEaseInOut);//時(shí)間曲線(xiàn)
CAViewAnimation::setAnimationRepeatAutoreverses(true);//是否執(zhí)行反動(dòng)作
CAViewAnimation::setAnimationRepeatCount(2);//反動(dòng)作執(zhí)行次數(shù)
 
CAViewAnimation::commitAnimations();//結(jié)束

我們可以根據(jù)自己的需求,定制更多的屬性來(lái)實(shí)現(xiàn)我們想要的動(dòng)畫(huà)效果。這是CAViewAnimation最基本的用法,beginAnimations和commitAnimations函數(shù)都是成對(duì)出現(xiàn)的,上一段代碼就能夠?qū)崿F(xiàn)讓CAView放大5倍的動(dòng)畫(huà)效果,雖然我們沒(méi)有設(shè)置它的時(shí)間,但默認(rèn)時(shí)間為0.2秒


動(dòng)畫(huà)的嵌套

CAViewAnimation::beginAnimations("animation1", NULL);
CAViewAnimation::setAnimationDuration(0.8);//設(shè)置animation1時(shí)間
 
//1部分的動(dòng)畫(huà)
CAViewAnimation::beginAnimations("animation2", NULL);
CAViewAnimation::setAnimationDuration(0.8);//設(shè)置animation2時(shí)間
 
//2部分的動(dòng)畫(huà)
CAViewAnimation::commitAnimations();//結(jié)束1
CAViewAnimation::commitAnimations();//結(jié)束2

多個(gè)CAViewAnimation之間可以嵌套使用,可以設(shè)置不同的時(shí)間、延時(shí)、反函數(shù)及回調(diào)等。當(dāng)一定要注意View屬性改變的位置,要寫(xiě)在對(duì)應(yīng)的嵌套層級(jí)。


監(jiān)聽(tīng)與回調(diào)

CAViewAnimation::beginAnimations("animation1", NULL);//開(kāi)始
 
//開(kāi)始回調(diào),在A(yíng)nimation開(kāi)始時(shí)調(diào)用
CAViewAnimation::setAnimationWillStartSelector(this, CAViewAnimation0_selector(FirstViewController::callbackStartAnimation0));
 
/*
*CAView屬性的改變:縮放、位置、旋轉(zhuǎn)、透明度等等.
*例如:label->setScale(5);
*/
 
//結(jié)束回調(diào),在A(yíng)nimation結(jié)束時(shí)調(diào)用
CAViewAnimation::setAnimationDidStopSelector(this, CAViewAnimation2_selector(FirstViewController::callbackStopAnimation2));
 
CAViewAnimation::commitAnimations();//結(jié)束
開(kāi)始回調(diào)函數(shù)如下
void FirstViewController::callbackStartAnimation0()
{
    CCLog("callbackStartAnimation0-->");
}
 
結(jié)束回調(diào)函數(shù)如下
void FirstViewController::callbackStopAnimation2(const std::string& animationID , void* context)
{
    //輸出animationID
    CCLog("animationID:%s",animationID.c_str());
}

注意:回調(diào)的第二個(gè)參數(shù)“void* context”就是CAViewAnimation::beginAnimations("animation1", NULL);傳入的第二個(gè)參數(shù)(我們這里傳的是NULL),它本身是一個(gè)void指針類(lèi)型,使用時(shí)候需要類(lèi)型轉(zhuǎn)換。開(kāi)始回調(diào)函數(shù)如下


例如:

    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);//設(shè)置時(shí)間
     
    label->setScale(5);
     
    CAViewAnimation2_selector(FirstViewController::callbackStopAnimation2));//結(jié)束回調(diào),在A(yíng)nimation結(jié)束時(shí)調(diào)用
     
    CAViewAnimation::commitAnimations();//結(jié)束
     
    回調(diào):
    void FirstViewController::callbackStopAnimation2(const std::string& animationID , void* context)
    {
        CALabel* label = (CALabel*)context;
         
         
        if (label) {
            label->setRotation(180);
        }
    }
    


    這個(gè)樣我們就可以獲得Label并改變其屬性,當(dāng)然我們可以傳入其他類(lèi)型的參數(shù)。

    組合動(dòng)畫(huà)
    1同時(shí)執(zhí)行

    默認(rèn)情況下,CAView的屬性變化寫(xiě)在一對(duì)beginAnimations()和commitAnimations()直接,這些所有的變化將是同時(shí)執(zhí)行。

    2順序執(zhí)行

    方法一:延時(shí)

    利用延時(shí),在上一個(gè)Animation時(shí)間結(jié)束后,再執(zhí)行下一個(gè)Animation。

    //第一個(gè)Animation
    CAViewAnimation::beginAnimations("", NULL);
     
    CAViewAnimation::setAnimationDuration(1.8);
     
    label->setRotation(180);
     
    CAViewAnimation::commitAnimations();   
     
    //第二個(gè)Animation
    CAViewAnimation::beginAnimations("", NULL);
     
    CAViewAnimation::setAnimationDuration(2.8);
    CAViewAnimation::setAnimationDelay(1.8);//延時(shí)1.8秒
     
    label->setScale(5);
     
    CAViewAnimation::commitAnimations();
    

    方法二:回調(diào)

    利用Animation的介紹回調(diào)

    CAViewAnimation::beginAnimations("animation1", NULL);//開(kāi)始
     
    /*
    *CAView屬性的改變:縮放、位置、旋轉(zhuǎn)、透明度等等.
    *例如:label->setScale(5);
    */
     
    //結(jié)束回調(diào),在A(yíng)nimation結(jié)束時(shí)調(diào)用
    CAViewAnimation::setAnimationDidStopSelector(this, CAViewAnimation0_selector(FirstViewController::callbackStopAnimation0));
     
    CAViewAnimation::commitAnimations();//結(jié)束
     
    在回調(diào)函數(shù)里實(shí)現(xiàn)另一個(gè)Animation
    void FirstViewController::callbackStopAnimation0()
    {
        CAViewAnimation::beginAnimations("NextAnimation", NULL);//開(kāi)始
         
        /*
        *CAView屬性的改變:縮放、位置、旋轉(zhuǎn)、透明度等等.
        *例如:label->setRotation(180);
        */
         
        CAViewAnimation::commitAnimations();//結(jié)束
    }

    CAViewAnimation 方法

    static void beginAnimations(const std::string& animationID, void* context);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    const std::string&animationID動(dòng)畫(huà)標(biāo)識(shí)符
    void*context用于回調(diào)函數(shù)的參數(shù),一般為NULL

    解釋?zhuān)罕硎緞?dòng)畫(huà)開(kāi)始


    static void commitAnimations();

    返回值:void

    參數(shù):

    解釋?zhuān)罕硎緞?dòng)畫(huà)結(jié)束


    static void setAnimationDuration(float duration);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    floatduration動(dòng)畫(huà)時(shí)間

    解釋?zhuān)簞?dòng)畫(huà)所用的時(shí)間,默認(rèn)為0.2秒


    static void setAnimationDelay(float delay);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    floatdelay延遲時(shí)間

    解釋?zhuān)簞?dòng)畫(huà)延時(shí)多長(zhǎng)時(shí)間后開(kāi)始播放,默認(rèn)為0秒


    static void setAnimationCurve(const CAViewAnimationCurve& curve);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    CAViewAnimationCurve&curve曲線(xiàn)

    解釋?zhuān)涸O(shè)置動(dòng)畫(huà)的曲線(xiàn)方式(就是動(dòng)畫(huà)的總體變化的時(shí)間曲線(xiàn):開(kāi)始快最后慢,開(kāi)始慢最后快,最后慢,均勻線(xiàn)性)

    typedef enum
    {
        CAViewAnimationCurveLinear = 0,       // 均勻線(xiàn)性
        CAViewAnimationCurveEaseOut,          // 結(jié)束時(shí)緩慢
        CAViewAnimationCurveEaseIn,           // 開(kāi)始時(shí)緩慢
        CAViewAnimationCurveEaseInOut         // 開(kāi)始和結(jié)束時(shí)都慢,中間快
    }CAViewAnimationCurve;


    static void setAnimationRepeatCount(float repeatCount);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    floatrepeatCount重復(fù)次數(shù)

    解釋?zhuān)簞?dòng)畫(huà)的重復(fù)次數(shù),默認(rèn)1次


    static void setAnimationRepeatAutoreverses(bool repeatAutoreverses);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    boolrepeatAutoreverses動(dòng)畫(huà)結(jié)束后,是否執(zhí)行反向動(dòng)作

    解釋?zhuān)簞?dòng)畫(huà)結(jié)束后,是否執(zhí)行反向動(dòng)作,默認(rèn)為false


    static void setAnimationWillStartSelector(CAObject* target, SEL_CAViewAnimation0 selector);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    CAObject* target目標(biāo)
    SEL_CAViewAnimation0selector選擇器

    解釋?zhuān)簞?dòng)畫(huà)開(kāi)始時(shí),調(diào)用SEL_CAViewAnimation0函數(shù),SEL_CAViewAnimation0函數(shù)是一個(gè)無(wú)參數(shù)的函數(shù)

     

    static void setAnimationWillStartSelector(CAObject* target, SEL_CAViewAnimation2 selector);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    CAObject* target目標(biāo)
    SEL_CAViewAnimation2selector選擇器

    解釋?zhuān)簞?dòng)畫(huà)開(kāi)始時(shí),調(diào)用SEL_CAViewAnimation2函數(shù),SEL_CAViewAnimation2函數(shù)是一個(gè)有兩個(gè)參數(shù)的函數(shù),分別是const std::string& animationID和void* context

       

    static void setAnimationDidStopSelector(CAObject* target, SEL_CAViewAnimation0 selector);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    CAObject*target目標(biāo)
    SEL_CAViewAnimation0selector選擇器

    解釋?zhuān)簞?dòng)畫(huà)結(jié)束時(shí),調(diào)用SEL_CAViewAnimation0函數(shù),SEL_CAViewAnimation0函數(shù)是一個(gè)無(wú)參數(shù)的函數(shù)


    static void setAnimationDidStopSelector(CAObject* target, SEL_CAViewAnimation2 selector);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    CAObject*target目標(biāo)
    SEL_CAViewAnimation2selector選擇器

    解釋?zhuān)簞?dòng)畫(huà)結(jié)束時(shí),調(diào)用SEL_CAViewAnimation2函數(shù),SEL_CAViewAnimation2函數(shù)是一個(gè)有兩個(gè)參數(shù)的函數(shù),分別是const std::string& animationID和void* context


    static void removeAnimations(const std::string& animationID);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    const std::string&animationID動(dòng)畫(huà)標(biāo)識(shí)符

    解釋?zhuān)焊鶕?jù)animationID移除對(duì)應(yīng)的動(dòng)畫(huà)


    static void removeAnimationsWithView(CAView* view);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    CAView*viewView動(dòng)畫(huà)

    解釋?zhuān)阂瞥龑?duì)應(yīng)的CAView的動(dòng)畫(huà)


    static void setAnimationsEnabled(bool enabled);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    boolenabled是否啟用

    解釋?zhuān)涸O(shè)置是否禁用動(dòng)畫(huà)效

       

    static bool areAnimationsEnabled();

    返回值:void

    參數(shù):

    解釋?zhuān)簞?dòng)畫(huà)是否被禁用


    static bool areBeginAnimations();

    返回值:void

    參數(shù):

    解釋?zhuān)簞?dòng)畫(huà)是否開(kāi)始執(zhí)行


    static bool areBeginAnimationsWithID(const std::string& animationID);

    返回值:void

    參數(shù):

    類(lèi)型參數(shù)名說(shuō)明
    const std::string&animationID動(dòng)畫(huà)標(biāo)識(shí)符

    解釋?zhuān)簩?duì)應(yīng)的animationID的動(dòng)畫(huà)是否開(kāi)始執(zhí)行

    以上內(nèi)容是否對(duì)您有幫助:
    在線(xiàn)筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號(hào)
    微信公眾號(hào)

    編程獅公眾號(hào)