0

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

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

动画

这是代码。相对布局在 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 中的视图有什么等效的吗?还是有其他想法?

顺便说一句,当将视图滑出时它工作正常。这是相反的代码。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);  
4

1 回答 1

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);
于 2013-04-23T18:00:49.277 回答