0

我有一个我想制作动画的菜单。我通过更改边距并插入新菜单来拆分菜单。当我想插入菜单时,动画是:

    level3Height = level3Frame.getHeight();

    final int newBottomMargin = (int)(origBottomMargin + level3Height/2);
    final int newTopMargin = (int)(origTopMargin + level3Height/2);

    splitUp = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            LinearLayout.LayoutParams params =  (LinearLayout.LayoutParams) btnShopWireless.getLayoutParams();
            params.bottomMargin = (int)(newBottomMargin * interpolatedTime);
            btnShopWireless.setLayoutParams(params);
        }
    };

    joinDown = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            LinearLayout.LayoutParams params =  (LinearLayout.LayoutParams) btnShopWireless.getLayoutParams();
            params.bottomMargin = (int)(origBottomMargin * interpolatedTime);
            btnShopWireless.setLayoutParams(params);
        }
    };
    splitUp.setDuration(1000);
    splitUp.setInterpolator(new BounceInterpolator());

    joinDown.setDuration(500);
    joinDown.setInterpolator(new BounceInterpolator());

获得插入菜单的高度后,动画很好地将视图向上移动:

    btnShopWireless.startAnimation(splitUp);

一切都很好!但....

当我想删除插入的级别菜单并将内容向下移动时,我使用下面的,并且动画不会发生 - 视图只是猛烈地回到原来的位置,没有平滑的运动。

    btnShopWireless.startAnimation(joinDown);

我将 AnimationListeners 设置为 setVisibility 到 VISIBLE onAnimationStart,并将 setVisibility 设置为 GONE onAnimationEnd。他们正在做他们的工作,所以我知道动画正在被调用,否则在用于 joinDown 的 AnimationListeners 中永远不会出现可见性。但是动画运动倒退从未发生过。我只能动画第一个,splitUp。

任何人都知道我为了让第二个动画工作而缺少什么线索吗?

4

1 回答 1

0

我弄清楚我的问题是什么——纯智商下溢。

originalMargin 是 0。我将它们增加到大约 190dp 以适应第三个菜单。当需要将菜单放在一起并删除第三个菜单时,转换再次使用原始边距乘以时间值。无论多少时间或哪个插值器,originalMargin*interpolatedTime 始终为 0。

为了解决这个问题,我使用了这个计算:

    joinDown = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            LinearLayout.LayoutParams params =  (LinearLayout.LayoutParams) btnShopWireless.getLayoutParams();
            params.bottomMargin = (int)(newBottomMargin -(level3Height/2 * interpolatedTime)); 
            btnShopWireless.setLayoutParams(params);
        }
    };  
于 2013-09-05T19:42:27.467 回答