我基于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);
}
}
请告诉我如何根据动画的结束位置重置视图的位置?
答案 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)
反转你的动画;首先为您的视图提供一个新位置,然后从旧位置动画到新位置。