アニメーションを介して 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);