[转载+实践理解]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 ...
随机推荐
- 常见的FPGA内串行数据采样的方式
总结下常见的对串行数据采样的三种方式: 1. 全采样存储方式: 采用过采样,用过采样时钟,用移位寄存器移位,把每次采样值都存起来.采用高速的过采样时钟运行. 然后等待触发条件,(就是找到数据的起始点条 ...
- 在SurfaceView中自由书写和擦除
/////////继承SurfaceView 的类 public class PaintView extends SurfaceView implements Runnable,SurfaceHold ...
- 微设计(www.weidesigner.com)介绍系列文章(三)
微设计(www.weidesigner.com)是一个专门针对微信公众账号提供营销推广服务而打造的第三方平台. 3.1 优惠券 优惠券是用于微信上与顾客互动的一种营销方式,不仅能够展现自己的产品,更能 ...
- Nio得知3——该示范基地:多路复用器模式
Reactor模式和NIO 本文可以看作是Doug Lea Scalable IO in Java一文的翻译. 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socke ...
- php_linux_centos6.4_安装mysql_apache_php
原文:php_linux_centos6.4_安装mysql_apache_php 原文 : http://blog.csdn.net/xiaoliouc/article/details/176395 ...
- HTTPS背后的加密算法(转)
当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一 ...
- Oracle安装及使用入门
新手Oracle安装及使用入门 一.安装Oracle Step1 下载oracle压缩包并解压到同一文件夹下面 Step2 双击setup.exe进行安装 Step3:进入如下界面配置: 邮箱可不 ...
- javascript 的Date 格式化, 模仿shell中date命令的格式
原文:javascript 的Date 格式化, 模仿shell中date命令的格式 shell 中显示当前的日期 [root@localhost]$ date '+%Y-%m-%d %H:%M:%S ...
- c++的string容器
c++相比c的一个好处就是实现了很多的容器和泛型算法,使得程序员的工作得到了很大的化简.其中一个很有用的泛型容器就是string.string是一个类,是一个在STL里边实现好了的类,由于他的很多功能 ...
- 【设计模式】Abstract Factory模式
抽象工厂模式是工厂方法模式的进一步强化.当工厂函数仅仅须要产生一种类型的产品(全部产品都继承自同一抽象基类)时,使用工厂方法模式就可以. 可是.当用户程序须要创建多种类型的产品,而这些产品又有一定的内 ...