6

这太奇怪了,我有这个动画代码:

public class ExpandAnimation extends Animation {
private View mAnimatedView;
private MarginLayoutParams mViewLayoutParams;
private int mMarginStart, mMarginEnd;
private boolean mWasEndedAlready = false;

/**
* Initialize the animation
* @param view The layout we want to animate
* @param duration The duration of the animation, in ms
*/
    public ExpandAnimation(View view, int duration) {
        setDuration(duration);
        mAnimatedView = view;
        mViewLayoutParams = (MarginLayoutParams) view.getLayoutParams();

        mMarginStart = mViewLayoutParams.rightMargin;
        mMarginEnd = (mMarginStart == 0 ? (0- view.getWidth()) : 0);
        view.setVisibility(View.VISIBLE);
        mAnimatedView.requestLayout();
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        if (interpolatedTime < 1.0f) {
            // Calculating the new bottom margin, and setting it
            mViewLayoutParams.rightMargin = mMarginStart
                    + (int) ((mMarginEnd - mMarginStart) * interpolatedTime);
            // Invalidating the layout, making us seeing the changes we made
            mAnimatedView.requestLayout();

        // Making sure we didn't run the ending before (it happens!)
        } else if (!mWasEndedAlready) {
            mViewLayoutParams.rightMargin = mMarginEnd;
            mAnimatedView.requestLayout();
            mWasEndedAlready = true;
        }
    }
}

我使用这个动画:

View parent = (View) v.getParent();
View containerMenu = parent.findViewById(R.id.containerMenu);
ExpandAnimation anim=new ExpandAnimation(containerMenu, 1000);
containerMenu.startAnimation(anim);

此动画切换隐藏/显示它的布局。

默认情况下,它是隐藏的。当我单击时,动画会起作用并显示出来。当我再次单击时,它会正确收缩。但是第三次​​,它什么也没做。我已经调试过,我发现构造函数被调用但不是 applyTransformation不知何故,如果我单击屏幕周围的任何布局,动画就会突然开始。

任何想法?

编辑 有谁知道 applyTransformation 何时触发?

4

1 回答 1

10

我不明白为什么,但是当我单击或对任何布局执行任何操作时,动画终于开始了。所以我以编程方式添加了一个解决方法。我的布局中有一个滚动视图,所以我移动了滚动位置:

hscv.scrollTo(hscv.getScrollX()+1, hscv.getScrollY()+1);

这之后containerMenu.startAnimation(anim);

这只是工作,我不明白为什么。

另外,我发现一些动画在 android > 4 上运行完美,但在 2.3 上,它有同样的问题,可以扩大和缩小,但不能第二次扩大。

parent.invalidate();

成功了。

于 2013-03-27T11:18:28.830 回答