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);

私は、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