动画结束后更改视图的位置

时间:2011-12-13 13:12:35

标签: android android-animation

我基于ViewGroup开发了一个小部件,我的问题是我需要在动画结束后保存项目的位置。我在我创建的setFillAfter(true)动画对象中调用AnimationListener,并在其onAnimationEnd方法调用View.layout(l,t,r,b)中设置动画后的位置,因为我希望动画从新项目的位置开始下次。但在这种情况下,看起来物品的布局是两次。如果我在动画结束时不使用View.layout(l,t,r,b),则下一个动画从之前的位置开始。这是我的代码:

private void scrollUp() {
    for(int i = 0; i < getChildCount(); i++) {
        final View child = getChildAt(i);
        final int index = i; 
        final int newleft = child.getLeft() + mOffsetBetweenItems;
        final int newTop = child.getTop() - mOffsetBetweenItems;
        TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);          
        scrollUp.setDuration(1500);
        scrollUp.setFillAfter(true);        
        scrollUp.setAnimationListener(
            new AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {}

                @Override
                public void onAnimationRepeat(Animation animation) {}

                @Override
                public void onAnimationEnd(Animation animation) {
                    child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight() );
                }
            }
        );

        child.startAnimation(scrollUp);
    }
}

请告诉我如何根据动画的结束位置重置视图的位置?

3 个答案:

答案 0 :(得分:19)

您必须使用ObjectAnimator,它适用于API 11级别。它会自动更改“查看位置”,

这是示例

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX);
objectAnimator.setDuration(1000);
objectAnimator.start();

感谢JUL的answer

如果找不到您的应用object animator,请更改Project -> properties -> Android的API级别,而不是import android.animation.ObjectAnimator;

答案 1 :(得分:12)

我做到了。这是代码:

private void scrollUp() {
    for(int i = 0; i < getChildCount(); i++) {
        final View child = getChildAt(i);
        final int index = i; 
        final int newleft = child.getLeft() + mOffsetBetweenItems;
        final int newTop = child.getTop() - mOffsetBetweenItems;
        TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);          
        scrollUp.setDuration(1500);
        scrollUp.setFillEnabled(true);        
        scrollUp.setAnimationListener(
            new AnimationListener() {

                @Override
                public void onAnimationStart(Animation animation) {}

                @Override
                public void onAnimationRepeat(Animation animation) {}

                @Override
                public void onAnimationEnd(Animation animation) {
                    child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight() );
                }
            }
        );

        child.startAnimation(scrollUp);
    }
}

刚刚删除了setFillAfter(true)并写了setFillEnabled(true)而不是。但在这种情况下,我不理解setFillEnabled()工作的逻辑,因为它提供的行为与文档中的描述不同。

答案 2 :(得分:0)

反转你的动画;首先为您的视图提供一个新位置,然后从旧位置动画到新位置。