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

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

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. qt tableview列头背景颜色设置

    设置表列头背景颜色 QHeaderView::section { background: rgb(255, 255, 127); }

  2. Go基础学习

    Go基础学习 go的基础语法 fmt.Println("hello world!") //go采用行分隔符 关键字 下面列举了 Go 代码中会使用到的 25 个关键字或保留字: b ...

  3. kafka消费之kafka查看topic是否有数据

    通过原生kafka,查看对应的topic是否有数据 下载kafka:登录Apache kafka官方下载 http://kafka.apache.org/downloads.html 配置config ...

  4. Delphi 保留字

  5. Codeforces1223E. Paint the Tree(树形dp)

    题目链接:传送门 题目大意: 给出节点数为n的一棵带权树,和每个点的最大染色数k.一条边的权重w能产生价值w的条件是,这条边的两端的点至少有一个颜色相同.颜色种类数无限,但每种只能使用两次,问能产生的 ...

  6. Hostapd初始化失败

    Hostapd hostapd 是一个用户态用于AP和认证服务器的守护进程.它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端, ...

  7. jquery 判断是否为空

    jquery 判断是否为空 if(my_val == null || my_val == undefined || my_val==""){ console.log("我 ...

  8. linux上开启和分析mysql慢查询日志

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

  9. python之同步IO和异步IO

    linux操作系统基础知识 用户空间和内核空间 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核保证内核的安全,操 ...

  10. 理解 es7 async/await

    简介 JavaScript ES7 中的 async / await 让多个异步 promise 协同工作起来更容易.如果要按一定顺序从多个数据库或者 API 异步获取数据,你可能会以一堆乱七八糟的 ...