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()工作的逻辑,因为它提供的行为与文档中的描述不同.