[转载+实践理解]Android动画---如何正确使用平移动画(关于fillBefore和fillAfter的一点说明)(转载)
红色部分为自己的实践理解
如何实现将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);//这个必须设置在AnimationSet上面,设置在Animation上不起作用,网上很多写法其实是错误的
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的点击位置会有问题,和看见的位置有偏差。
比如你把一个button用动画从最左面移到最右面,虽然UI上显示button到了最右面,但其实你在右面点button并不会触发click事件,只有点最左面才会触发
正确方法:
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向上平移自身高度一半的距离,然后播放动画,从最初位置一直向上移动目标位置。
初看感觉是在原始位置下1/2处开始动画往上,最后到原始位置,其实不是这样的,正如总结里说的要倒过来看,是先把view的位置真正移上去自身一半高度,然后从移上去一半高度的位置算那个动画初始位置,其实就是最初位置开始动画,网上移一半高度,最后其实就是mView.offsetTopAndBottom(-mView.getHeight() / 2)的位置。
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放置到最终的目标位置,
然后倒过来,播放从原始位置到目标位置的动画。
如果动画结束后把view设成View.Gone的话,这段动画直接放在onCreate()中的话,动画不会启动,因此做demo的时候总发现怎么不触发,放到view的Click事件里触发就没问题。包括-mView.getHeight() / 2在onCreate里因为onMeasure等方法因为没有执行完成,所以getHeight()是不正确的。因此如果学习的时候,只是做小demo看结果的话最好不要直接放在onCreate里(具体原因和解决方案看http://blog.csdn.net/johnny901114/article/details/7839512)
[转载+实践理解]Android动画---如何正确使用平移动画(关于fillBefore和fillAfter的一点说明)(转载)的更多相关文章
- [转载] 深入理解Android之Java虚拟机Dalvik
本文转载自: http://blog.csdn.net/innost/article/details/50377905 一.背景 这个选题很大,但并不是一开始就有这么高大上的追求.最初之时,只是源于对 ...
- 【转载】理解Android中垃圾回收日志信息
本文转自:http://droidyue.com/blog/2014/11/08/understanding-garbage-collection-output-messages-in-android ...
- [serverlet][转载: 深入理解HTTP Session]
[serverlet][转载: 深入理解HTTP Session] 标签(空格分隔): 未分类 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...
- Android中四种补间动画的使用示例(附代码下载)
场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程 ...
- (转载)你真的理解Android AIDL中的in,out,inout么?
前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了——或者并没有,但所占篇幅甚小,且基本上都是 ...
- Android 用Animation-list实现逐帧动画 (转载)
转自:http://blog.csdn.net/aminfo/article/details/7847761 第一步:先上图片素材,以下素材放到res/drawable目录下: http://blog ...
- Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921,本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...
- Android开发之Tween(补间动画)
在android中动画主要有三种,①帧动画(http://blog.csdn.net/dmk877/article/details/45893017)这篇文章已经详细的进行了讲解,②补间动画这也是这篇 ...
- Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0下面)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921.本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...
随机推荐
- MySQL 更新中国列:1366 Incorrect string value 问题解决了
周围环境:Win7 64位置,mysql-5.6.25-winx64,MySQL workbench 问题:MySQL在更新时出现异常: warning(s): 1366 Incorrect stri ...
- 配置Apacheserver
配置Apacheserver 一.目的 能够有一个測试的server,不是全部的特殊网络服务都能找到免费得! 二.为什么我们要用"Apache"? Apache是眼下使用最广的we ...
- 解决SQL订阅过程中找不到已经创建的订阅
原文:解决SQL订阅过程中找不到已经创建的订阅 之前有写过一篇博客,主要是图解SQL复制技术:图解SQL 2008数据库复制,当时的测试环境是在我本地同一个服务器上面,所以测试的时候可谓是一帆风顺,最 ...
- FZU 2082 过路费(树链剖分)
FZU 2082 过路费 题目链接 树链抛分改动边的模板题 代码: #include <cstdio> #include <cstring> #include <vect ...
- tomcat-jQ-springMVC-bootstrap
基于tomcat-jQ-springMVC-bootstrap的公司产品管理WEB应用 管理员登录后台以后才能操作 ,权限管理只有一个管理员, 系统的主要作用是查看所有的 “公司列表”, 并查看该公司 ...
- Message解析流程(转)
Message的解析作为一个共同组件.对应不同格式的msg文件有不同的实现类来解析.用SAXParser. 1:Final class MessageResourceManager 在Start方 ...
- 基于LINUX的多功能聊天室
原文:基于LINUX的多功能聊天室 基于LINUX的多功能聊天室 其实这个项目在我电脑已经躺了多时,最初写完项目规划后,我就认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来 ...
- UML对象图和包图
UML九已经介绍过的基本图,然后,我们再来看看对象图和包图. 一.对象图 谈到对象.我们不得不说一下对象.对象(Object)是对象类的实例(Instance),用于模型化特定的实体.对象是唯一的. ...
- OCP读书笔记(27) - 题库(ExamG)
601.You need to perform a block media recovery on the tools01.dbf data file in the SALES database by ...
- Tips & Tricks:Apache log4j简明教程(二)
在上一讲Apache log4j简明教程(一)中介绍了log4j的基本概念,配置文件,以及将日志写入文件的方法,并给出了一个详细的示例.这一讲,我在继续谈一谈如何使用log4j将日志写入MySQL数据 ...