红色部分为自己的实践理解

如何实现将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的一点说明)(转载)的更多相关文章

  1. [转载] 深入理解Android之Java虚拟机Dalvik

    本文转载自: http://blog.csdn.net/innost/article/details/50377905 一.背景 这个选题很大,但并不是一开始就有这么高大上的追求.最初之时,只是源于对 ...

  2. 【转载】理解Android中垃圾回收日志信息

    本文转自:http://droidyue.com/blog/2014/11/08/understanding-garbage-collection-output-messages-in-android ...

  3. [serverlet][转载: 深入理解HTTP Session]

    [serverlet][转载: 深入理解HTTP Session] 标签(空格分隔): 未分类 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  4. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程 ...

  5. (转载)你真的理解Android AIDL中的in,out,inout么?

    前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了——或者并没有,但所占篇幅甚小,且基本上都是 ...

  6. Android 用Animation-list实现逐帧动画 (转载)

    转自:http://blog.csdn.net/aminfo/article/details/7847761 第一步:先上图片素材,以下素材放到res/drawable目录下: http://blog ...

  7. Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921,本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...

  8. Android开发之Tween(补间动画)

    在android中动画主要有三种,①帧动画(http://blog.csdn.net/dmk877/article/details/45893017)这篇文章已经详细的进行了讲解,②补间动画这也是这篇 ...

  9. Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0下面)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921.本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...

随机推荐

  1. Codeforces 420 B. Online Meeting

    B. Online Meeting time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. react.js 从零开始(六)Reconciliation

    Reconciliation   React 的关键设计目标是使 API 看起来就像每一次有数据更新的时候,整个应用重新渲染了一样.这就极大地简化了应用的编写,但是同时使 React 易于驾驭,也是一 ...

  3. Atitit.软体guibuttonand面板---通信子系统(范围)-- github 采用....

    Atitit.软体guibuttonand面板---通讯子系统(区)-- github 的使用.... 1. 1.注冊账户以及创建仓库 1 2. 二.在GitHub中创建项目(create a new ...

  4. java字节中的基本类型的职业的数目 (采访总是问)

    因为移动装置存储器中的移动开发的局限性,数据的字节数需要考虑往往在占领中使用的类型. 下面介绍下一个Java,以加深记忆. 在Java中一共同拥有8种基本数据类型,当中有4种整型,2种浮点类型,1种用 ...

  5. 【Cocos得知】技术要点通常的积累

    1.粒子特效 CCParticleSystem*sp = CCParticleSnow::create(); sp->setTexture(CCTextureCache::sharedTextu ...

  6. Java数据结构与算法(3) - ch04栈(栈和转置)

    栈的基本特性是后进先出,最简单的用途是用于转置,还有其他诸如括号匹配,中序表达式(A+B*(C-D/(E+F)) --> ABCDEF+/-*+)和后续表达式(345+*612+/- --> ...

  7. net.sf.json 迄今 时刻 格式 办法

    创作工具类 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import  ...

  8. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  9. 批量执行SQL文件

    原文:批量执行SQL文件 摘要:很多时候我们在做系统升级时需要将大量的.sql文件挨个执行,十分不方便.而且考虑到执行顺序和客服的操作方便性,能不能找到一种简单的方法来批量执行这些sql文件呢? 主要 ...

  10. (c#2.0)serialPort串口通讯

    原文:(c#2.0)serialPort串口通讯 using System; using System.Collections.Generic; using System.ComponentModel ...