上一篇介绍了插值动画,插值动画是直接作用于窗口对象的。

数值动画则可以作用于任何对象。

SOUI内置了3种数值类型的动画,分别是SIntAnimator, SFloatAnimator, SColorAnimator,分别对应int, float, COLOR这3种数据类型,当然用户也可以扩展支持其它数据类型,不过基本上这3种就足够了。

下面以demo中使用的ColorAnimator为例来介绍如何使用数值动画。

首先,和插值动画一样,我们需要一个XML来描述这个动画。

<?xml version="1.0" encoding="utf-8"?>
<colorAnimator duration="1000" valueFrom="RGBA(0,0,0,128)" valueTo="RGBA(255,0,0,128)" repeatCount="1" repeatMode="reverse"/>

上面是一个colorAnimator, 它描述了一个将颜色值从rgba(0,0,0,128)变化为rgba(255,0,0,128)的动画,一次动画持续1秒,再加一次重复,这个动画一共2秒。

定义好动画后,我们需要在代码中加载这个动画:

void CMainDlg::OnSouiClick()
{
IValueAnimator * pAni = SApplication::getSingletonPtr()->LoadValueAnimator(L"valueAni:colorAni");
if(pAni)
{
pAni->addListener(this);
pAni->addUpdateListener(this);
pAni->start(this);
}
}

上面代码首先从ValueAni:colorAni指定的XML资源里加载并创建一个IVaueAnimator对象,创建成功以后,调用pAni->addUpdateListener(this)来设置动画回调。然后调用pAni->start(this)来启动动画。

注意这里这个pAni对象没有被其它对象持有。所以在这里start完成后,并不能直接release。

第三步,就是响应数值变化:

Demo中CMainDlg实现了IValueAnimator::IAnimatorUpdateListener接口,这个接口只有一个方法:

struct IAnimatorUpdateListener
{
virtual void onAnimationUpdate(IValueAnimator *pAnimator) = ;
};

这个方法在CMainDlg中的实现如下:

void CMainDlg::onAnimationUpdate(IValueAnimator *pAnimator)
{
SWindow *pTst = FindChildByName(L"tree_test");
if(pTst)
{
SColorAnimator *ani = sobj_cast<SColorAnimator>(pAnimator);
if(ani)
{
SStringW strColor;
SColor cr(ani->getValue());
strColor.Format(L"RGBA(%d,%d,%d,%d)",cr.r,cr.g,cr.b,cr.a);
pTst->SetAttribute(L"colorBkgnd",strColor);
}
}
}

我们首先找到tree_test这个控件,在这个动画过程中,我们通过动画获得一个颜色值,再用这个颜色值来改变tree_test的背景颜色。这里实际上相当于实现了一个Android的属性动画。

最后,在动画完成的时候,我们做下面的处理:

void CMainDlg::onAnimationEnd(IValueAnimator * pAnimator)
{
SWindow *pTst = FindChildByName(L"tree_test");
if(pTst)
{
pTst->SetAttribute(L"colorBkgnd",L"RGBA(255,255,255,0)");//set invalid colorBkgnd
pAnimator->Release();
}
}

在这里,我们把tree_test的背景色恢复成不使用背景,再调用pAnimator->Release()来释放数据动画对象。

下面看一下数值动画运行的效果。

这是一个简单的数据动画的demo,虽然例子很简单,实际上用户可以使用它完成各种任务,这里不再一一举例。

启程软件  2019年8月4日

在SOUI3.0中使用数值动画的更多相关文章

  1. SOUI3.0仿Android插值动画使用方法

    在Android系统中,有插值动画,数值动画,属性动画,帧动画. 帧动画,在SOUI里可以通过AnimateImg这个控件来实现,其它几种动画3.0之前不支持,需要类似动画效果,只能自己通过定时器去实 ...

  2. Unity 4.0 中的新动画系统——MecAnim

    分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...

  3. (六)Unity5.0新特性------新动画功能

     unity 5.0 中的新动画功能 这里是你能够期待的新动画功能高速概述 ! State Machine Behaviours状态机行为 在Unity 5 中,你会能够将StateMachine ...

  4. vue2.0中动画

    #vue2.0中css动画不显示的坑: transition中包含的两个标签如果相同(此处都是p标签),需要为元素指定key.如果标签名不同的话,不指定key也可以出现动画效果. #vue2.0中js ...

  5. CSS3中的animation动画

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. Android中的帧动画与补间动画的使用

    前言 在日常开发中,我们有时候须要一些好看的动画效果,这时能够充分利用Android提供的这几种动画来实现. Android提供了3种类型的动画: 补间动画:补间动画能够应用于View,让你能够定义一 ...

  7. css3中的制作动画小总结

    系列教程 CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation: Transform 在CSS3中transform主要包括以下几种:旋转rotate. ...

  8. css3中变形与动画(三)

    transform可以实现矩阵变换,transition实现属性的平滑过渡,animation意思是动画,动漫,这个属性才和真正意义的一帧一帧的动画相关.本文就介绍animation属性. anima ...

  9. Servlet3.0中Servlet的使用

    目录 1.注解配置 2.异步调用 3.文件上传 相对于之前的版本,Servlet3.0中的Servlet有以下改进: l  支持注解配置. l  支持异步调用. l  直接有对文件上传的支持. 在这篇 ...

随机推荐

  1. SpringBoot页面展示Thymeleaf

    https://www.jianshu.com/p/a842e5b5012e 开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了.Spring ...

  2. Wannafly挑战赛22 C 多项式(大数,多项式极限)

    链接:https://ac.nowcoder.com/acm/contest/160/C 来源:牛客网 多项式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...

  3. 了解ffmpeg生态

    我以前整理的ffmpeg相关资料: 了解ffmpeg要读的资料 https://blog.csdn.net/yyhustim/article/details/9078941 ffmpeg和ffserv ...

  4. 清北学堂提高组突破营游记day5

    长者zhx来啦.. (又要送冰红茶了...) zhx一上来就讲动态规划...是不是要逼死人.... 动态规划: 最简单的例子:斐波那契数列.因为他是递推(通项公式不算)的,所以前面的已经确定的项不会影 ...

  5. java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)

    今天,我们来学习另一个重要的概念. CPU内存指令重排序(Memory Reordering) 什么叫重排序? 重排序的背景 我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多.当CP ...

  6. jquery预览本地图片

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  7. VCL界面控件DevExpress VCL Controls发布v19.1.2|附下载

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  8. jquery easyui datagrid 远程加载数据----javascript法

    jquery easyui有三种办法生成datagrid(数据网格),本篇专门讨论javascript借助jquey easy ui实现的方式 html部分 <main role="m ...

  9. 使用vue开发输入型组件更好的一种解决方式(子组件向父组件传值,基于2.2.0)

    (本人想封装一个带有input输入框的组件) 之前使用vue开发组件的时候,在遇到子组件向父组件传递值时我采用的方法是这样的: 比如子组件是一个输入框,父组件调用时需要获取到子组件输入的值,子组件通过 ...

  10. org.hibernate.NonUniqueObjectException 原因及解决办法

    问题 使用hibernate更新对象时,出现如下错误: org.hibernate.NonUniqueObjectException: a different object with the same ...