本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
今天的文章里,我将会和大家讨论对动画流的控制。我们可以通过Animator系列的API来控制动画的开始、停止和取消。在 KitKat也就是API level 19中,我们还可以控制动画的暂停和恢复。在本文中,我将会带你体验整个动画流的控制,并且通过一些函数方法来让你能够观察到动画的状态。
动画流介绍
在之前的教程中,我们已经使用过多次Animator.start这个方法。这个方法是用来让动画从第一帧开始播放。该方法只是动画流控制方法集中的一个方法而已,完整的方法集合如下所示:
;
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
start这个方法顾名思义是用来让动画从开头开始播放的。如果动画设置了一个大于0的播放延迟(startDelay),那么调用该方法后还需要等到延迟的时间过去才回开始播放。
我们有两种停止动画的方法,你可以用end方法抑或cancel方法来停止一个播放着的动画。在两种方式中动画都会终止并且只有再次调用start方法才会重新开始播放。两者的区别则在于停止后动画所在的状态,当你使用cancel方法来停止动画后,动画只是停止了它的时间轴,动画的状态会停在一个中间态(intermediate state)。如果通过end 方法来停止一个动画,那么动画会直接快进到该动画最后一帧并且停止,所有的对象都会保持在动画最终结束后的状态。
在 Kitkat 中增加的没有怎么被大家关注到的新API则是带来了动画可以暂停和恢复的能力。在那之前,一个动画如果被取消并且停留在当前的中间态,此时你用start方法去重启动画,动画只会从一开始重新播放。现在,你则可以调用pause方法来暂停当前播放中的动画,pause也会有和cancel方法一样的功效让动画停留在中间态,但是当你使用resume 方法去恢复这个动画的时候,动画会从这个状态继续播放下去。
现在,让我们来实践下看看效果。我们新建一个 Activity 并且包含一个 私有的动画对象。并且在 onCreate 回调中初始化这个动画。
@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
)
;
我们的动画是一个简单的旋转动画,它将把一个图片完整旋转360度五次。被旋转的图片会在 layout 的 XML 文件中定义好,并且给予一个叫some_image的id。这个layout同时也包含了五个按钮分别是:Start、End、Cancel、Pause以及Resume。这五个按钮分别代表了动画的五个调用方法。
;
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
(
)
;
这些方法只是简单的调用了相应的动画控制调用。下面会有两张gif图片来演示效果。上边的动画展示了end方法和cancel方法的区别。可以注意到,cancel让图片保持在停止时的中间态,但是end则让动画到了最后的状态。
下边的动画则演示了pause和resume方法。可以注意到,pause 和cancel都暂停了动画的时间轴。但是现在我们可以用resume 调用去恢复动画的时间轴了。
动画状态的查询
有些时候,我们需要去查询当前动画的状态,这个需求可以通过下面这些方法来完成。
;
html
-
script
:
false
]
boolean
isStarted
(
)
// added in API 14
boolean
isRunning
(
)
boolean
isPaused
(
)
// added in API 19
如果当前动画已经调用了start函数并且还没播放完成也没有被取消掉,那么isStarted方法会返回true。
请注意
,isStarted 方法最低的 API 需求是 14.同时,就算是在动画播放延迟中,该方法依然会返回 true。这就是这个方法和 isRunning 方法的不同点,isRunning 方法只会在动画确实在播放并且还没停止的时候返回 true。
在 API 19 的时候,isPaused 方法被加入进来。这是由于那时候动画可以被暂停和恢复了,如果 isPaused 返回了 true,那么说明当前动画是在暂停状态下,反之亦然。
为了演示这些观察方法的效果,我们会通过一个包含三个显示动画状态文本框的例子来解释。这三个文本框都会在Activity中做为TextView成员变量存在。
;
html
-
script
:
false
]
private
TextView
isStartedText
;
private
TextView
isRunningText
;
private
TextView
isPausedText
;
;
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
)
;
;
html
-
script
:
false
]
public
void
setStatusTexts
(
)
{
isStartedText
.
setText
(
"isStarted = "
+
anim
.
isStarted
(
)
)
;
isRunningText
.
setText
(
"isRunning = "
+
anim
.
isRunning
(
)
)
;
isPausedText
.
setText
(
"isPaused = "
+
anim
.
isPaused
(
)
)
;
;
html
-
script
:
false
]
public
void
cancelAnimation
(
View
view
)
{
anim
.
cancel
(
)
;
setStatusTexts
(
)
;
演示的结果我们可以从下面上方的动画中看到。这里我也创建了两个动画,一个演示End和cancel效果,另一个演示pause和 Resume效果。可以注意到,动画的运行状态在你点击了End和cancel之后是相同的,就算视觉上看两者并不一样。这说明了,你没法通过动画的状态来区分出当前动画是通过 End 调用还是cancel调用来停止的。这两者情况下,isStarted和isRunning都会返回false。
而下边的动画则显示了pause和resume调用的效果。当我们通过pause调用去暂停动画时,isPaused会返回true。然后通过 resume调用去恢复动画播放后,isPaused也会变成false。可以注意到,图中如果动画是自然结束的,动画的状态并没有改变。当然,动画停止播放后,isStarted和isRunning肯定应该是返回false的。实际上,在动画自然停止后,如果我们再去调用 isStarted和isRunning他们的的确确会返回false。而动画中的例子我们并没有在动画自然停止后去更新状态,所以我们并不知道当前的状态,自然那几个文本框也就没有更新。为了能够更新到最新的状态,我们可以在动画中添加AnimatorListener和 AnimatorPauseListener这两个监听,这两个监听具体的使用方法会是下一讲的主要内容。
如果你对教程中的例子有兴趣,欢迎去
GitHub
上下载完整代码。
本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6913159.html
,如需转载请自行联系原作者
Android动画 补间动画
补间动画:属于Android中View动画的一种,就是涵盖了 平移、缩放、旋转 和 透明度四种变化的动画。实现方式有两种:xml文件 和 java代码。
四种补间动画分别为RotateAnimation、ScaleAnimation、TranslateAnimation、AlphaAnimation,他们的父类为Animation。
岁月不待人-祥
在属性动画中,常用到的API有ValueAnimator,ObjectAnimator。
ValueAnimator:时间引擎,负责计算各个帧的属性值,基本上其他属性动画都会直接或间接继承它;
ObjectAnimator: ValueAnimator 的子类,对指定对象的属性执行动画。