Android 视图在动画中移动的时间是我想要的时间的两倍

Android 视图在动画中移动的时间是我想要的时间的两倍,android,android-layout,Android,Android Layout,我想让myView从当前位置移动deltaX、deltaY像素。 但它移动的时间比我想要的长两倍。 这是由onAnimationEnd中的setLayoutParams引起的。 没有这一点,myView的真正地位就不会改变。 如何更改myView的真实位置并正常设置动画 class MyLayout extends RelativeLayout { Animation animation; MyView myView; animation = new Translate

我想让myView从当前位置移动deltaX、deltaY像素。 但它移动的时间比我想要的长两倍。 这是由onAnimationEnd中的setLayoutParams引起的。 没有这一点,myView的真正地位就不会改变。 如何更改myView的真实位置并正常设置动画

class MyLayout extends RelativeLayout {
    Animation animation;
    MyView myView;

    animation = new TranslateAnimation(0, deltaX, 0, deltaY);
    animation.setDuration(100);
    animation.setFillAfter(true);
    myView.startAnimation(animation);           
}

class MyView extends ImageView {
    protected void onAnimationEnd() {
        super.onAnimationEnd();
        LayoutParams params = (LayoutParams)getLayoutParams();
        params.leftMargin += deltaX;
        params.topMargin += deltaY;
        setLayoutParams(params);
    }
}   

如果要避免在现在执行两次所需的视图平移,则必须将动画的“setFillAfter”标志设置为false。正如文档所述,“当setFillAfter设置为true时,动画转换将在动画结束后应用。”

另一方面,如果将“setFillAfter”标志保留为true,则视图应转换到所需位置,并且onAnimationEnd方法中不需要修改LayoutParams。因此,可能是有什么东西阻碍了转换,如果您可以提供有关视图所属布局的进一步信息,这将非常有用


另一件事是,设置布局参数的边距以移动视图并不完全是最好的主意。更像一个黑客。而是尝试直接设置视图的位置,或者尝试在父视图中使用权重。这样,您将在多个不同的屏幕上获得相同的效果。

如果删除setFillAfter(true),我似乎可以工作。当setFillAfter为true时,您确定不需要修改吗?请点击。我对这个链接也有同样的问题。另一个问题是:如何直接设置视图的位置?你是说layout()方法吗?当你只是使用动画来转换视图(将fill after设置为true)时,动画将始终从初始位置移动到由delta移动的位置。所以,如果您想要一个功能,点击按钮将导致视图始终以增量移动,那么不要将fill after设置为true。相反,正如您所做的那样,只在onAnimationEnd方法中移动视图。对于您的第二条评论,布局方法是最好的解决方案,您甚至在之前发布的线程中有一个示例。