【问题标题】:Android TranslateAnimation Processes Stuff After Animation During AnimationAndroid TranslateAnimation 在动画期间处理动画后的东西
【发布时间】:2013-04-25 00:48:33
【问题描述】:

我正在尝试通过动画在 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);  

【问题讨论】:

  • 也许您应该尝试从 Animation.AnimationListener.onAnimationEnd 调用 onShowAd()
  • 好主意,但行不通。我基于此的原始示例是使用线性布局。它可能只是不适合相对布局吗?

标签: android animation android-relativelayout android-animation


【解决方案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);

【讨论】:

  • 这很有意义,但没有乐趣 :-( 完全相同的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2012-01-03
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多