SOUI3.0仿Android插值动画使用方法
在Android系统中,有插值动画,数值动画,属性动画,帧动画。
帧动画,在SOUI里可以通过AnimateImg这个控件来实现,其它几种动画3.0之前不支持,需要类似动画效果,只能自己通过定时器去实现,实现成本比较高。
SOUI3.0增加了插值动画和数值动画支持,属性动画可以通过数值动画来实现,因此没有专门移植。
这一讲我先讲插值动画。
有Android开发经验的朋友,应该知道Android的插值动画有AlphaAnimation, TranslationAnimation, ScaleAnimation, RotateAnimation, AnimationSet这5个类,它们都有共同的基类Animation。
3.0把这些Animation都移植到了SOUI。
在SOUI使用插值动画和Android中类似,先通过XML定义好一个动画,然后加载动画,再交给SWindow去播放动画。
下面以AnimationSet为例来说明如何使用。
1、定义动画XML:
<?xml version="1.0" encoding="utf-8"?>
<set repeatCount="-1">
<alpha duration="500" fromAlpha="1.0" toAlpha="0.5" repeatCount="1" repeatMode="reverse"/>
<rotate duration="500" startOffset="1000" fromDegrees="0" toDegrees="360" pivotX="50%" pivotY="50%" repeatMode="restart" repeatCount="0"
interpolator="linear"/>
<set startOffset="1500">
<scale duration="500" fromXScale="1.0f" toXScale="0.5" fromYScale="1.0" toYScale="0.5" repeatCount="1" repeatMode="reverse"/>
</set>
</set>
上面代码来自demo\uires\Anim\rotate.xml
这个XML描述的是一个AnimationSet动画,里面包含了一个AlphaAnimation,一个RotateAnimation及另一个包含ScaleAnimation的AnimationSet。
首先可以看到最外层的set有一个repeatCount属性,值为-1,代表无限重复。
然后我们注意到这里第一个alpha动画,duration=500代表这个动画执行一次需要500ms, 再注意它有一个repeatCount=1,代表这个动画执行2次,repeatMode=reverse,代表这个动画第一次alpha从1.0到0.5, 第二次重复的时候变成从0.5到1.0。
然后我们注意一下第二个rotate动画,它多了一个startOffset=1000,这个1000正好是上一个动画的总执行时间,也就是说这个rotate动画是在alpha动画完成之后再执行。fromDegree, toDegree, pivotX, pivotY是rotate动画的专有属性,含义见代码。这里注意一下interpolator属性,interpolator代码插值器类型,如果不指定这个属性,系统默认使用AccelerateDecelerate插值器,这个插值器是先加速再减速。上面例子则调整为线性插值器。
最后再看它的第3个子动画,它也是一个set动画。它从1500MS开始,正好是上一个rotate动画结束。这个set里只有一个scale动画,它先缩小到50%,后放大100%。
整个动画过程分成了3段,它们在时间是连续的,总共执行2500MS。
当然这些子动画完全可以同步进行,也可以不连续。
2、加载动画:
和所有SOUI其它资源一样,首先这个XML应该放到uires目录下,并且在uires.idx文件能够正确引用到这个文件。
<anim>
<file name="love" path="anim\love.xml"/>
<file name="slide_show" path="anim\slide_show.xml"/>
<file name="slide_hide" path="anim\slide_hide.xml"/>
<file name="rotate" path="anim\rotate.xml"/>
</anim>
最后一个name=rotate就是这个动画资源。
配置好资源,就可以在代码中引用这个动画了:
void CMainDlg::InitSoui3Animation()
{
SWindow *pWnd = FindChildByName(L"img_soui");
if (pWnd)
{
IAnimation *pAni = SApplication::getSingletonPtr()->LoadAnimation(L"anim:rotate");
if(pAni)
{
pWnd->SetAnimation(pAni);
pAni->Release();
}
}
}
通过SAppliation::LoadAnimation来加载这个动画。
3、将这个动画交给SWindow来播放。注意上面代码中的pWnd->SetAnimation,这样这个动画就会立即播放。SetAnimation会在SWindow内部持有这个IAnimation,因此这里还需要调用pAni->Release(),以保证动画资源不使用后能释放内存。如果希望动画延时播放,可以调用pAni->SetStartOffset()来配置。
下图是这个动画在demo中的执行效果:
截图时间轴不太准确,具体见demo。
注意:SOUI的AnimationSet和Android的AnimationSet有两个区别:
1、SOUI的AnimationSet支持repeatCount属性,但不支持repeatMode属性。
2、和SOUI相反,Android的AnimationSet支持repeatMode属性,但不支持repeatCount属性。
实际上Android的repeatMode属性意义不大,它不过是把这个属性直接传递给它的子动画对象,并不是作用于AnimationSet本身。考虑到如果和Android一样支持repeatMode传递给子对象可能会产生误解,SOUI中干脆就不支持这个属性了。需要的话,直接在子对象上设置这个属性就好了。
启程软件 2019年8月4日
SOUI3.0仿Android插值动画使用方法的更多相关文章
- 在SOUI3.0中使用数值动画
上一篇介绍了插值动画,插值动画是直接作用于窗口对象的. 数值动画则可以作用于任何对象. SOUI内置了3种数值类型的动画,分别是SIntAnimator, SFloatAnimator, SColor ...
- Android ListView动画实现方法
在Android中listview是最经常使用的控件之中的一个,可是有时候我们会认为千篇一律的listview看起来过于单调,于是就产生了listView动画,listview载入了动画会让用户体验更 ...
- Android透明动画
Android透明动画 核心方法 public void startAnimation(Animation animation) 执行动画,参数可以是各种动画的对象,Animation的多态,也可以是 ...
- Android旋转动画
Android旋转动画 核心方法 public void startAnimation(Animation animation) 执行动画,参数可以是各种动画的对象,Animation的多态,也可以是 ...
- Android缩放动画
Android缩放动画 核心方法 public void startAnimation(Animation animation) 执行动画,参数可以是各种动画的对象,Animation的多态,也可以是 ...
- Android平移动画
Android平移动画 核心方法 public void startAnimation(Animation animation) 执行动画,参数可以是各种动画的对象,Animation的多态,也可以是 ...
- android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码
Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...
- Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸
Android特效专辑(五)--自定义圆形头像和仿MIUI卸载动画-粒子爆炸 好的,各位亲爱的朋友,今天讲的特效还是比较炫的,首先,我们会讲一个自定义圆形的imageView,接着,我们会来实现粒子爆 ...
- Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现
周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...
随机推荐
- Git小结---So far.......
基本的: 1. 在配置了SSH Key的情况下,clone项目时使用:git clone git@github.com/用户名/仓库名.git 使用这种方式而不使用https的方式的好处在于,在pu ...
- 初探 -5 JavaScript 语法
JavaScript 是一个程序语言.语法规则定义了语言结构. JavaScript 语法 JavaScript 是一个脚本语言. 它是一个轻量级,但功能强大的编程语言. JavaScript 字面量 ...
- 初探 -1 JavaScript
JavaScript 教程 JavaScript 是 Web 的编程语言. 所有现代的 HTML 页面都使用 JavaScript. JavaScript 非常容易学. 本教程将教你学习从初级到高级J ...
- 架构师必备,带你弄清混乱的JAVA日志体系!
作者:孤独烟 出处:http://rjzheng.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任 ...
- Laravel session的保存机制
与$_SESSION不同Laraver中的session是在当次程序执行完毕时保存到文件或其他存储引擎中的,也就是说如果使用了die等强制结束程序的函数将不会自动保存session导致session失 ...
- Eclipse中配置Python插件
1.点击Window ---> preferences ,左边的标题栏找到Pydev 2. 在Pydev里找到含有Python的选项,点击,在右侧New,弹出框中找到Python的安放目录下的 ...
- docker python3环境搭建
1.使用镜像为daocloud的python镜像 docker run -it --rm --name my-running-script -v "$PWD":/usr/src/m ...
- apk反编译(仅供娱乐)
第一个文件夹里面放apk,第二个解析classes.dex,第三个查看java代码,下面三个apktool用来解析apk文件, 记得在环境变量中配置apktool,路径为apktool所在路径 1.解 ...
- python+selenium封装UI自动化框架
seleinum框架 框架的思想: 解决我们测试过程中的问题:大量的重复步骤,用自动化来实现 1)配置和程序的分离 2)测试数据和程序的分离 3)不懂编程的人员可以方便使用:使用的 ...
- C# WPF开机自启动和只允许一个程序运行
本文出自:https://www.cnblogs.com/2186009311CFF/p/10024949.html 在App.xaml.cs填充一下内容,即可实现只允许一个运行,且不解锁屏幕的情况下 ...