学向勤中得,萤窗万卷书。这篇文章主要讲述Android属性动画:动画流控制相关的知识,希望能为你提供帮助。
今天的文章里,我将会和大家讨论对动画流的控制。我们可以通过Animator系列的API来控制动画的开始、停止和取消。在 KitKat也就是API level 19中,我们还可以控制动画的暂停和恢复。在本文中,我将会带你体验整个动画流的控制,并且通过一些函数方法来让你能够观察到动画的状态。
动画流介绍在之前的教程中,我们已经使用过多次Animator.start这个方法。这个方法是用来让动画从第一帧开始播放。该方法只是动画流控制方法集中的一个方法而已,完整的方法集合如下所示:
java
1 2 3 4 5 6 | ; html-script: false ] Animator.start() // start the animation from the beginning Animator.end() // end the animation Animator.cancel() // cancel the animation Animator.pause() // added in API 19; pause the animation Animator.resume() // added in API 19; resume a paused animation |
我们有两种停止动画的方法,你可以用end方法抑或cancel方法来停止一个播放着的动画。在两种方式中动画都会终止并且只有再次调用start方法才会重新开始播放。两者的区别则在于停止后动画所在的状态,当你使用cancel方法来停止动画后,动画只是停止了它的时间轴,动画的状态会停在一个中间态(intermediate state)。如果通过end 方法来停止一个动画,那么动画会直接快进到该动画最后一帧并且停止,所有的对象都会保持在动画最终结束后的状态。
在 Kitkat 中增加的没有怎么被大家关注到的新API则是带来了动画可以暂停和恢复的能力。在那之前,一个动画如果被取消并且停留在当前的中间态,此时你用start方法去重启动画,动画只会从一开始重新播放。现在,你则可以调用pause方法来暂停当前播放中的动画,pause也会有和cancel方法一样的功效让动画停留在中间态,但是当你使用resume 方法去恢复这个动画的时候,动画会从这个状态继续播放下去。
现在,让我们来实践下看看效果。我们新建一个 Activity 并且包含一个 私有的动画对象。并且在 onCreate 回调中初始化这个动画。
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ; html-script: false ] private ObjectAnimator anim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.property_animations_flow); ImageView someImage = (ImageView) findViewById(R.id.some_image); anim = ObjectAnimator.ofFloat(someImage, "rotation", 0, 360); anim.setDuration(1000); anim.setRepeatCount(5); anim.setRepeatMode(ObjectAnimator.RESTART); } |
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ; html-script: false ] public void startAnimation(View view) { anim.start(); } public void endAnimation(View view) { anim.end(); } public void cancelAnimation(View view) { anim.cancel(); } public void pauseAnimation(View view) { anim.pause(); } public void resumeAnimation(View view) { anim.resume(); } |
下边的动画则演示了pause和resume方法。可以注意到,pause 和cancel都暂停了动画的时间轴。但是现在我们可以用resume 调用去恢复动画的时间轴了。
文章图片
文章图片
动画状态的查询【Android属性动画(动画流控制)】有些时候,我们需要去查询当前动画的状态,这个需求可以通过下面这些方法来完成。
Java
1 2 3 4 | ; html-script: false ] boolean isStarted() // added in API 14 boolean isRunning() boolean isPaused() // added in API 19 |
在 API 19 的时候,isPaused 方法被加入进来。这是由于那时候动画可以被暂停和恢复了,如果 isPaused 返回了 true,那么说明当前动画是在暂停状态下,反之亦然。
为了演示这些观察方法的效果,我们会通过一个包含三个显示动画状态文本框的例子来解释。这三个文本框都会在Activity中做为TextView成员变量存在。
Java
1 2 3 4 | ; html-script: false ] private TextView isStartedText; private TextView isRunningText; private TextView isPausedText; |
Java
1 2 3 4 | ; html-script: false ] isStartedText = (TextView) findViewById(R.id.status_is_started); isRunningText = (TextView) findViewById(R.id.status_is_running); isPausedText = (TextView) findViewById(R.id.status_is_paused); |
Java
1 2 3 4 5 6 | ; html-script: false ] public void setStatusTexts() { isStartedText.setText("isStarted = " + anim.isStarted()); isRunningText.setText("isRunning = " + anim.isRunning()); isPausedText.setText("isPaused = " + anim.isPaused()); } |
Java
1 2 3 4 5 | ; html-script: false ] public void cancelAnimation(View view) { anim.cancel(); setStatusTexts(); } |
文章图片
文章图片
而下边的动画则显示了pause和resume调用的效果。当我们通过pause调用去暂停动画时,isPaused会返回true。然后通过 resume调用去恢复动画播放后,isPaused也会变成false。可以注意到,图中如果动画是自然结束的,动画的状态并没有改变。当然,动画停止播放后,isStarted和isRunning肯定应该是返回false的。实际上,在动画自然停止后,如果我们再去调用 isStarted和isRunning他们的的确确会返回false。而动画中的例子我们并没有在动画自然停止后去更新状态,所以我们并不知道当前的状态,自然那几个文本框也就没有更新。为了能够更新到最新的状态,我们可以在动画中添加AnimatorListener和 AnimatorPauseListener这两个监听,这两个监听具体的使用方法会是下一讲的主要内容。
如果你对教程中的例子有兴趣,欢迎去 GitHub 上下载完整代码。
推荐阅读
- IBM AppScan官方帮助文档错别字缺陷,IBM的測试人员也太粗心了吧
- android studio中文乱码问题
- 在NETAPP CIFS文件夹中强制修改权限的方法
- 在Android中实现阴影效果
- Android 高版本API方法在低版本系统上的兼容性处理
- SpringMVC学习——SpringMVC高级参数绑定与@RequestMapping注解
- 我的Android进阶之旅------>android Button上面的英文字符串自己主动大写的问题解决
- 为了方便h5页面在app上调试看到打印的日志重写window.console
- 如何修复PHPMyAdmin错误(Incorrect format parameter(格式参数不正确))