码迷,mamicode.com
首页 > 其他好文 > 详细

风火轮 – 动画效果:浮入与劈裂

时间:2015-03-05 13:04:45      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

今天花了一个半小时,实现两个动画效果:浮入与劈裂。

1.  浮入效果

头文件

 

enum CbwFloatDirection { // 浮入方向

         cfdUp= 0, // 上浮

                   cfdDown= 1 // 下浮

         };

/**

 *@class TCbwAnimationEffect_ FloatIn

 *@brief 动画基类

 *

 * 处理浮入动画效果

 *@author 陈斌文

 *@version 1.0

 *@date 2015-03-05

 *@QQ: 282397369

 */

class TCbwAnimationEffect_FloatIn : publicTCbwAnimationEffect { // 浮入

 

         virtualTRect __fastcall BuildDisplayRect(OBJECTMAT * m);

         virtualvoid __fastcall BuildDisplayMat(cv::Mat& destMat, cv::Mat& srcMat,TRect displayRect);

 

public:

         __fastcallTCbwAnimationEffect_FloatIn();

         staticTCbwAnimationEffect * Build();

};

 

实现代码:

 

// ***************************** 浮入效果**************************************

__fastcallTCbwAnimationEffect_FloatIn::TCbwAnimationEffect_FloatIn()

         :TCbwAnimationEffect() {

         EffectType= cetFloatIn;

}

 

TCbwAnimationEffect *TCbwAnimationEffect_FloatIn::Build() {

         returnnew TCbwAnimationEffect_FloatIn;

}

 

浮入过程中,位置将渐次变化,重载BuildDisplayRect处理:

TRect __fastcallTCbwAnimationEffect_FloatIn::BuildDisplayRect(OBJECTMAT * m) {

         TPointstartPos(m->LeftTopPosition.x, m->LeftTopPosition.y),

                   endPos(m->LeftTopPosition.x,m->LeftTopPosition.y);

         intdelta = 100;

         if(cfdUp == EffectOptionType) // 上浮

                            startPos.y= endPos.y + delta;

         if(cfdDown == EffectOptionType) // 下浮

                            startPos.y= endPos.y - delta;

         intx = startPos.x + (endPos.x - startPos.x) * (FCurrentIndex + 1)

                   /FPeriodLength;

         inty = startPos.y + (endPos.y - startPos.y) * (FCurrentIndex + 1)

                   /FPeriodLength;

         TRectresult(x, y, x + m->Mat.cols, y + m->Mat.rows);

         returnresult;

}

 

为了更增加动画效果,可以在变换过程中加入对像素的控制,即淡出效果

void __fastcallTCbwAnimationEffect_FloatIn::BuildDisplayMat(cv::Mat& destMat,

         cv::Mat&srcMat, TRect displayRect) {

         InnerTrans_FadeOut(destMat,srcMat);

}

// ***************************** 浮入效果**************************************

配置资源:

技术分享

最终效果:

 技术分享

2.  劈裂效果

头文件

enum CbwSplitDirection { // 劈裂方向

         csdVertCollapse= 0, // 上下向中央收缩

                   csdVertExpand= 1, // 中央向上下展开

                   csdHorzCollapse= 2, // 左右向中央收缩

                   csdHorzExpand= 3 // 中央向左右展开

         };

/**

 *@class TCbwAnimationEffect_Split

 *@brief 动画基类

 *

 * 处理浮入动画效果

 *@author 陈斌文

 *@version 1.0

 *@date 2015-03-05

 *@QQ: 282397369

 */

class TCbwAnimationEffect_Split : publicTCbwAnimationEffect { // 劈裂

         virtualvoid __fastcall BuildMaskMat(cv::Mat& destMat, cv::Mat& srcMat, TRectdisplayRect);

 

public:

         __fastcallTCbwAnimationEffect_Split();

         staticTCbwAnimationEffect * Build();

};

 

实现代码:

 

// ***************************** 劈裂效果**************************************

__fastcallTCbwAnimationEffect_Split::TCbwAnimationEffect_Split()

         :TCbwAnimationEffect() {

         EffectType= cetSplit;

}

 

TCbwAnimationEffect *TCbwAnimationEffect_Split::Build() {

         returnnew TCbwAnimationEffect_Split;

}

 

劈裂过程,可通过控制屏蔽矩阵来达到效果,即控制将拷贝的区域

void __fastcall TCbwAnimationEffect_Split::BuildMaskMat(cv::Mat&destMat,

         cv::Mat&srcMat, TRect displayRect) {

         TRectwholeRect(0, 0, displayRect.right - displayRect.left,

                   displayRect.bottom- displayRect.top);

         TRectpartRect = wholeRect;

         doublecx = partRect.right / 2.0, cy = partRect.bottom / 2.0;

         boolvertFlag = (EffectOptionType <= csdVertExpand);

         doubledelta = double(FCurrentIndex + 1) / FPeriodLength * (vertFlag ?

                   cy: cx);

         if(csdVertExpand == EffectOptionType) { // 上下向中央收缩

                   partRect.top= cy - delta;

                   partRect.bottom= cy + delta;

         }

         if(csdVertCollapse == EffectOptionType) { // 中央向上下展开

                   partRect.top= delta;

                   partRect.bottom= 2 * cy - delta;

         }

         if(csdHorzExpand == EffectOptionType) { // 左右向中央收缩

                   partRect.left= cx - delta;

                   partRect.right= cx + delta;

         }

         if(csdHorzCollapse == EffectOptionType) { // 中央向左右展开

                   partRect.left= delta;

                   partRect.right= 2 * cx - delta;

         }

         boolexpandFlag =

                   (csdVertExpand== EffectOptionType ||

                   csdHorzExpand== EffectOptionType);

 

         BYTE* pSrc = srcMat.data;

         BYTE* pDst = destMat.data;

         for(int row = 0; row < destMat.rows; ++row)

                   for(int col = 0; col < destMat.cols; ++col) {

                            boolhasValueFlag = (*pSrc++ != 0);

                            if(!hasValueFlag)

                                     *pDst = 0;

                            inty = (row - partRect.top) * (partRect.bottom - row);

                            intx = (col - partRect.left) * (partRect.right - col);

                            boolinFlag = (y >= 0 && x >= 0);

                            if(!expandFlag)

                                     inFlag= (y > 0 && x > 0);

                            boolsetFlag = (inFlag == expandFlag);

                            *pDst++= (setFlag ? 255 : 0);

                   }

}

// ***************************** 劈裂效果**************************************

 

配置资源

技术分享

运行效果

 技术分享

 

回头再看一下,PPT中大概还有40个效果,如果按每天2个效果来实现的话,需要20天。加油。

风火轮 – 动画效果:浮入与劈裂

标签:

原文地址:http://blog.csdn.net/arwen/article/details/44079643

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!