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

teo*_*tik 8 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请给我一个建议,如何根据动画的结束位置重置视图的位置?

Hay*_*yan 20

你必须使用ObjectAnimator,它从API 11级别开始工作.它会自动更改View位置,

这是一个例子

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX);
objectAnimator.setDuration(1000);
objectAnimator.start();
Run Code Online (Sandbox Code Playgroud)

谢谢JUL的回答

如果没有找到你的应用程序object animator,改变从API级别Project -> properties -> Android,比import android.animation.ObjectAnimator;


teo*_*tik 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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