Android TranslateAnimation在动画期间动画后处理动画

时间:2013-04-23 17:46:37

标签: android animation relativelayout android-animation

我正试图通过动画在RelativeLayout的视图中滑动。一旦视图到位,我必须改变布局的布局参数,以便新视图不会阻止现有内容。我调用代码来在动画之后更新布局,但它发生在动画之前,导致动画期间区域块为空。

以下屏幕在动画之前,期间和之后:

animation

这是代码。相对布局在onShowAd中调整。

        float fromY = getAdHeight();
        float toY = 0;
        TranslateAnimation slide = new TranslateAnimation(0,0,fromY,toY);
        slide.setDuration(ANIMATION_RATE);
        slide.setFillAfter(true);
        mAdLayout.startAnimation(slide);
        onShowAd();
        mAdLayout.setVisibility(View.VISIBLE);

我尝试了调用可见和其他东西的不同命令,以及使用处理程序postDelayed onShowAd()等待与ANIMATION_RATE相同的时间但是发生了什么事情你盯着黑盒子的时间是发布延迟,然后必须等待动画,所以它更糟糕。在Windows中有一个API调用LOCKWINDOWUPDATE,我可以在窗口句柄中传递以防止更新...在Android中有什么等效的视图吗?还是其他任何想法?

顺便说一下,当滑动视图OUT时,它可以正常工作。这是代码走向另一个方向。 onHideAd是在这个中修改layoutparams的地方。

        float toY = ((View) mAdLayout.getParent()).getBottom();
        float fromY = 0;//toY - mAdLayout.getHeight();
        TranslateAnimation slide = new TranslateAnimation(0,0,fromY,toY);
        slide.setDuration(ANIMATION_RATE);
        slide.setFillAfter(true);           
        mAdLayout.startAnimation(slide); 
        mAdLayout.setVisibility(View.GONE);
        onHideAd();

感谢您的任何建议!

编辑:我添加了监听器,并没有处理它。我已将它隔离到以下代码中,该代码位于“onShowAd()”例程中:

        RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) mainFragmentContainer.getLayoutParams();
        params.addRule(RelativeLayout.ABOVE, mAdLayout.getId());
        mainFragmentContainer.setLayoutParams(params);

我试图通过使用handler.postDelayed调用它来进一步分离它,似乎我把它放在事件链中的任何地方都会导致它在动画本身显示之前发生。很奇怪! : - (

这是更新后的showAd例程。我也尝试重新排序一些调用。

        float fromY = getAdHeight();
        float toY = 0;
        TranslateAnimation slide = new TranslateAnimation(0,0,fromY,toY);
        slide.setDuration(ANIMATION_RATE);
        slide.setFillAfter(true);
        slide.setAnimationListener(new AnimationListener() {

            @Override 
            public void onAnimationStart(Animation animation) {}

            @Override 
            public void onAnimationRepeat(Animation animation) {}

            @Override
            public void onAnimationEnd(Animation animation) {
                onShowAd();
            }
        });
        mAdLayout.setVisibility(View.VISIBLE);
        mAdLayout.startAnimation(slide);  

1 个答案:

答案 0 :(得分:1)

您应该使用AnimationListener来完成您要找的内容。您遇到的问题是因为即使动画在设置为ANIMATION_RATE的时间内没有完成,也会立即返回开始动画的调用。

幻灯片放映:

    float fromY = getAdHeight();
    float toY = 0;
    TranslateAnimation slide = new TranslateAnimation(0,0,fromY,toY);
    slide.setDuration(ANIMATION_RATE);
    slide.setFillAfter(true);     
    slide.setAnimationListener(new AnimationListener() {            
        @Override
        public void onAnimationStart(Animation animation) {
        }           
        @Override
        public void onAnimationRepeat(Animation animation) {                
        }           
        @Override
        public void onAnimationEnd(Animation animation) {
             onShowAd();
        }
    });
    mAdLayout.setVisibility(View.VISIBLE);
    mAdLayout.startAnimation(slide);