zoukankan      html  css  js  c++  java
  • [转载+实践理解]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)

  • 相关阅读:
    eclipse 关闭web项目无用校验
    Java7的那些新特性
    Linux内核源码情景分析-wait()、schedule()
    android canvas 画图笔记
    android启动第一个界面时即闪屏的核心代码(两种方式)
    leetCode(24):Binary Search Tree Iterator
    12:打印 1 到最大的 n 位数
    Android仿QQ ios dialog,仿QQ退出向上菜单
    iOS UI16_数据持久化
    Android自己定义百度地图缩放图标
  • 原文地址:https://www.cnblogs.com/cqcmdwym/p/3372384.html
Copyright © 2011-2022 走看看