ImageView在RelativeLayout中的另一个视图更改后重置位置

时间:2013-06-04 15:14:21

标签: android relativelayout android-imageview android-animation

我有一个相对布局的ImageView。我正在使用Timer将ImageView从屏幕顶部移动到底部。以下是计时器的代码

timer.scheduleAtFixedRate(new TimerTask() {

    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            public void run() {

                ObjectAnimator anim= ObjectAnimator.ofFloat(submarine, "translationY", submarine.getTop(), submarine.getTop()+50);
                anim.setDuration(1000);
                submarine.setTop(submarine.getTop()+50);
                    submarine.setBottom(submarine.getBottom()+50);
                //submarine.startAnimation(sub_down);
                anim.start();
            }
        });


    }
}, 0, 3000);

ImageView被称为潜艇。动画效果很好但是当我在同一个TexViews中更改某些RelativeLayout的值时,ImageView的位置会重置为原始位置。我也尝试过使用Android的View动画但结果是一样的。有没有办法避免重置潜艇ImageView并保持其改变位置?

2 个答案:

答案 0 :(得分:0)

这是android动画的经典行为。您必须指定动画结束时要执行的操作,否则它将返回初始状态。

这是一个可以帮助您解决的问题:Android: Animation Position Resets After Complete

答案 1 :(得分:0)

我正在使用一个objectanimator,它应该将对象的位置保持在动画的末尾。唯一有效的方法是在动画结束时设置视图的边距,如下面的代码所示:

@Override
        public void onAnimationEnd(Animation animation) {
            runOnUiThread(new Runnable() {
                public void run() {
                    submarine.clearAnimation();
                    LayoutParams lp = new LayoutParams(submarine.getWidth(), submarine.getHeight());
                    lp.setMargins(submarine.getLeft(), submarine.getTop()+50, 0, 0);
                    submarine.setLayoutParams(lp);
                }
            });

如果您尝试使用setTop和setLeft定位项目,视图将重置为其原始位置。另一个注意事项是你需要在定位之前运行视图的clearAnimation方法,否则当动画结束时视图会闪烁。