如何正确使用平移动画(关于fillBefore和fillAfter的一点说明)

本文介绍如何使用Android Animation框架实现View向上平移自身高度一半的效果,并解决动画结束后的实际位置与视觉位置不符的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何实现将View向上平移自身高度一半的距离?

 

TranslateAnimation translate = new TranslateAnimation(

Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, 

Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f);

mView.startAnimation(translate);

问题:当动画结束后,View会跳回到原始位置。

 

改进:

AnimationSet set = new AnimationSet(true);

TranslateAnimation translate = new TranslateAnimation(

Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, 

Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f);

set.addAnimation(translate);

set.setFillAfter(true);

mView.startAnimation(set);

 

setFillAfter文档说明:

If fillAfter is true, the transformation that this animation performed 

will persist when it is finished. Defaults to false if not set.

设为true之后,界面会停留在动画播放完时的界面。

 

问题:动画结束后界面显示正确,但是View上各控件的实际位置和看上去的位置不对应,

实际位置还在View的原始位置,因此button的点击位置会有问题,和看见的位置有偏差。

 

正确方法:

AnimationSet set = new AnimationSet(true);

TranslateAnimation translate = new TranslateAnimation(

Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, 

Animation.RELATIVE_TO_SELF, 0.5, Animation.RELATIVE_TO_SELF, 0);

set.addAnimation(translate);

set.setFillAfter(true);

mView.offsetTopAndBottom(-mView.getHeight() / 2);

mView.startAnimation(set);

 

先将View向上平移自身高度一半的距离,然后播放动画,从最初位置一直向上移动目标位置。

 

setFillBefore文档说明:

If fillBefore is true, this animation will apply its transformation 

before the start time of the animation. Defaults to true if 

setFillEnabled(boolean) is not set to true.

 

对TranslateAnimation,setFillBefore默认为true,也就是说在动画开始前,先将transformation 

apply到View,这也就是为什么offsetTopAndBottom()后,View依然从原始位置开始运动。

如果setFillBefore设为false,动画播放时会有一个跳动,可以看到View从目标位置跳到原始位置。

 

总结:

使用Animation、AnimationSet框架实现的动画效果,必须先将View放置到最终的目标位置,

然后倒过来,播放从原始位置到目标位置的动画。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值