我写了一个简单的动画:<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:fillAfter="true">
<translate android:fromXDelta="0" android:toXDelta="-320"
   android:fromYDelta="0" android:toYDelta="0"
   android:duration="5000"/>
</set>在antivity里的button使用了这个动画后,由于android:fillAfter="true",故动画结束时button停在了动画最后一祯的位置,但是发现button的onClick还是在动画第一祯的位置,也就是最初的位置可以触发onClick。
而我原来的解决办法是,将android:fillAfter="false",然后在动画结束时button.layout(l,t,r,b)来设置位置,但是这样View会闪一下,效果很不好,大家有什么好的方法吗?谢谢!

解决方案 »

  1.   

    试下这个效果, 之前view会闪一下我也是被郁闷了很久...TranslateAnimation animationOpen = new TranslateAnimation(
    Animation.RELATIVE_TO_SELF, -1.0f,
    Animation.RELATIVE_TO_SELF, 0.0f, 
    Animation.RELATIVE_TO_SELF, 0.0f, 
    Animation.RELATIVE_TO_SELF, 0.0f);
    animationOpen.setDuration(500);
      

  2.   

    动画开始的时候你把button的visiable设置为gone, 然后设置layout位置, 在设置visiable,同时在这里开启上面的动画
      

  3.   

    我也遇到了这个问题,刚刚看了一下你们说的,就随便弄了一下,竟然解决了。我从左边滑动右边的时候,到了右边是还会抖动一下。我为动画添加了一个叫:mSlideLeftAnim.setFillEnabled(true);就解决了。
      

  4.   

     
    这个layout是怎么用的?
      

  5.   

    楼主求个代码  就“动画开始的时候你把button的visiable设置为gone, 然后设置layout位置, 在设置visiable,同时在这里开启上面的动画”这块的配置 发一下吧
      

  6.   

    发现很多朋友搜索到这个帖子然后M我问解决方法,实际上2楼的同学已经说得比较清楚了,我再和大家说明一下原理:
    Android中animation对于目标view的位置实际上是没有变化的,即android:fillAfter="true"时,动画结束后view停在动画最后一祯的位置,但实际touch响应位置还是在动画开始之前的位置。
    然后说一下解决的方法:
    方法之前是在view动画开始之前事先通过layout移动目标位置(设置visible=gone用户就看不到这个位置变化),然后再启动动画,而动画中view的初始位置是layout移动前的位置,结束位置是view当前位置,即:TranslateAnimation animationOpen =    new TranslateAnimation(
                            Animation.RELATIVE_TO_SELF, -1.0f,
                            Animation.RELATIVE_TO_SELF, 0.0f, 
                            Animation.RELATIVE_TO_SELF, 0.0f, 
                            Animation.RELATIVE_TO_SELF, 0.0f);
                    animationOpen.setDuration(500);
      

  7.   

    我来解析一下,这个方法应该可以叫"移位位置变换"吧例如初始位置是0,你要运动到 300
    那么你可以new TranslateAnimation(0, 300, 0, 0);来获得位移动画,但是移动后,它会闪回0位置,因为控件实际坐标还是0 (你可以用getX()来测试一下),而如果你用setFillAfter(true)来填充位置,它看起来停留在300了,可是你getX(),它还是0,这种情况就好像控件被拉伸了,但是实际坐标没有变,最要命的是,点击热区不会随控件移动(让人无法接受...)然后这里提出了先移位,再做位置变换,你先visibility-gone,移动好控件位置,再visibility-visible,然后这时候你控件的位置已经在300了,如果这时候你用new TranslateAnimation(0, 300, 0, 0),就会从300移动到600再弹回来,于是做个反向offset,new TranslateAnimation(-300, 0, 0, 0),那么就从0,运动到300,而且不回弹了
      

  8.   

    我来解析一下,这个方法应该可以叫"移位位置变换"吧例如初始位置是0,你要运动到 300
    那么你可以new TranslateAnimation(0, 300, 0, 0);来获得位移动画,但是移动后,它会闪回0位置,因为控件实际坐标还是0 (你可以用getX()来测试一下),而如果你用setFillAfter(true)来填充位置,它看起来停留在300了,可是你getX(),它还是0,这种情况就好像控件被拉伸了,但是实际坐标没有变,最要命的是,点击热区不会随控件移动(让人无法接受...)然后这里提出了先移位,再做位置变换,你先visibility-gone,移动好控件位置,再visibility-visible,然后这时候你控件的位置已经在300了,如果这时候你用new TranslateAnimation(0, 300, 0, 0),就会从300移动到600再弹回来,于是做个反向offset,new TranslateAnimation(-300, 0, 0, 0),那么就从0,运动到300,而且不回弹了
    还是这个回复让我看明白了,谢谢