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

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

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. 初探html-17 表单

    HTML 表单和输入 HTML 表单用于收集不同类型的用户输入. 在线实例 <form action=""> First name: <input type=&q ...

  2. php通过反射方法调用私有方法

    PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...

  3. opencv 读取视频内容写入图片帧

    现在主要把自己平时用到的opencv功能记录到博客,一方面方便自己有时间来回顾,另一方便提供给大家一个参考. opencv 读取视频内容,把视频帧每一帧写成图片,存入电脑中.这个步骤是许多数据处理的基 ...

  4. 在Linux中让echo命令显示带颜色的字

    echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色;文字颜色m字符串\033[0m" 例如: echo -e "\033[41;37 ...

  5. IBM小机拆镜像换盘

    1.硬盘告警信息     2.故障排查 查看错误日志 #  errpt   -aj   C62E1EB7     查看hdisk0的信息,发现hdisk0属于rootvg # lspv   查看hdi ...

  6. cdn工作原理

    cdn工作原理 1.用户向浏览器输入www.web.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS服务器请求: 2.网站的DNS域名解析器设置了CNAME,指向了www.web. ...

  7. Zookeeper客户端使用(使用zkclient)

    Zookeeper客户端使用 二.使用zkclient 在pom.xml中加入依赖 <dependency> <groupId>com.101tec</groupId&g ...

  8. jquery在线引用地址大全 全部来自官网

    谷歌的就算了,容易被屏蔽,下面都是官方原版的 最新版本 <script src="http://code.jquery.com/jquery-latest.js">&l ...

  9. ajax 请求成功,但是后台feigin请求超时解决方案

    ========后台请求数据时间较长,报feigin超时错误====== fegin报错如下: feign.RetryableException: Read timed out executing P ...

  10. docker安装踩坑记录

    .docker安装包安装很顺利, yum安装安装源在官网或镜像网站下载, fedora/centos分别下载不同的, 在/etc/yum.repos.d/doccker-ce.repo, 把网址改为镜 ...