博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android移动view动画问题
阅读量:6674 次
发布时间:2019-06-25

本文共 2195 字,大约阅读时间需要 7 分钟。

Android写动画效果不是一般的麻烦,网上找了好久,终于解决了动画的问题,总结记录以共勉。
仅以水平方向移动效果做说明,垂直方向类似。

 

完整动画函数代码: 

 1 
public 
void slideview(
final 
float p1, 
final 
float p2) {
 2     TranslateAnimation animation = 
new TranslateAnimation(p1, p2, 0, 0);
 3     animation.setInterpolator(
new OvershootInterpolator());
 4     animation.setDuration(durationMillis);
 5     animation.setStartOffset(delayMillis);
 6     animation.setAnimationListener(
new Animation.AnimationListener() {
 7         @Override
 8         
public 
void onAnimationStart(Animation animation) {
 9         }
10         
11         @Override
12         
public 
void onAnimationRepeat(Animation animation) {
13         }
14         
15         @Override
16         
public 
void onAnimationEnd(Animation animation) {
17             
int left = view.getLeft()+(
int)(p2-p1);
18             
int top = view.getTop();
19             
int width = view.getWidth();
20             
int height = view.getHeight();
21             view.clearAnimation();
22             view.layout(left, top, left+width, top+height);
23         }
24     });
25     view.startAnimation(animation);
26 }

 

 

调用示例: 
移动到目标位置
slideview(0, distance);
从目标位置移回原位

slideview(0, -distance); 

 

过程中遇到的问题:

 1、动画执行完成后,view回到原位

1 TranslateAnimation animation = 
new TranslateAnimation(p1, p2, 0, 0);
2 animation.setInterpolator(
new OvershootInterpolator());
3 animation.setDuration(durationMillis);
4 animation.setStartOffset(delayMillis);
5 view.startAnimation(animation);

开始时动画效果只写了这么多,发现动画执行完,view会回到原位。

经过查资料尝试使用animation.setFillAfter(true); view不再返回原位,但又出现了第2个问题

2、点击按钮时,view在初始位置会先闪一下,再执行动画 

 经过查资料得知,animation.setFillAfter(true); 只是将view移动到了目标位置,但是view绑定的点击事件还在原来位置,导致点击时会先闪一下

又查资料找到解决办法:
不加setFillAfter, 通过设置view位置实现效果,增加如下代码
 1 animation.setAnimationListener(
new Animation.AnimationListener() {
 2     @Override
 3     
public 
void onAnimationStart(Animation animation) {
 4     }
 5     
 6     @Override
 7     
public 
void onAnimationRepeat(Animation animation) {
 8     }
 9     
10     @Override
11     
public 
void onAnimationEnd(Animation animation) {
12         
int left = view.getLeft()+(
int)(p2-p1);
13         
int top = view.getTop();
14         
int width = view.getWidth();
15         
int height = view.getHeight();
16         view.clearAnimation();
17         view.layout(left, top, left+width, top+height);
18     }
19 });

 

在动画执行完毕后(onAnimationEnd)设置view的位置,同时要clearAnimation()

注:clearAnimation() 必须在 layout(l,t,r,b) 前执行,否则会出错~
至此大功告成~

转载于:https://www.cnblogs.com/eoiioe/archive/2012/08/29/2662546.html

你可能感兴趣的文章
Jhipster_cn中文翻译组
查看>>
Nagios简介与安装(1)
查看>>
centos 本地yum配置
查看>>
使用Vundle来管理vim的插件
查看>>
我们容易忽略的WebDriver 的一些方法
查看>>
Windows借助脚本实现自动化加域
查看>>
构造函数私有化
查看>>
我的友情链接
查看>>
Linux Shell编程
查看>>
归档与反归档
查看>>
Learning Data Structure_5_图(2)
查看>>
HDS G1000和Gx00的端口属性
查看>>
Innodb中mysql如何快速删除2T的大表
查看>>
bash基本命令的使用(笔记)
查看>>
windows_learn 002 用户管理和组策略
查看>>
kafka性能优化
查看>>
含有echart 图表的报表打印
查看>>
域控迁移为08 R2后无法访问Linux服务器共享
查看>>
我的友情链接
查看>>
华为认证考试
查看>>