私はこれに対する答えを何日も探していました。いくつかのことはうまくいく(そしてほとんどはうまくいかない)一方で、私がやろうとしていることのベストプラクティスを見つけられることを望んでいます。
アプリに表示する通知バーを取得しようとしています。理想的には、レイアウト内の他の要素をシフトしながら、上から下にスライドします。役立つイラストは次のとおりです。イラスト
レイアウトの構造は次のとおりです(簡潔にするために少し省略しました)。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false">
<!-- notification -->
<RelativeLayout
android:id="@+id/notification_bar"
android:layout_width="match_parent"
android:layout_height="40dip"
android:background="@drawable/notification_background"
android:visibility="visible">
<!-- end notifcation -->
</RelativeLayout>
<!-- header -->
<RelativeLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="47dip"
android:layout_alignParentTop="true" >
<ImageView
android:id="@+id/header_bg"
android:layout_width="match_parent"
android:layout_height="47dip"
android:src="@drawable/home_header" />
<!-- end header -->
</RelativeLayout>
<!-- buttons -->
<LinearLayout
android:id="@+id/buttons"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/footer"
android:layout_below="@id/notification_bar"
android:layout_gravity="center_horizontal">
<ImageButton
android:id="@+id/button1"
android:src="@drawable/button1"
android:layout_width="86dip"
android:layout_height="65dip"
android:layout_weight=".4" />
<ImageButton
android:id="@+id/button2"
android:src="@drawable/button2"
android:layout_width="98dip"
android:layout_height="73dip"
android:layout_weight=".2" />
<ImageButton
android:id="@+id/button3"
android:src="@drawable/button3"
android:layout_width="86dip"
android:layout_height="71dip"
android:layout_weight=".4" />
<!-- end buttons -->
</LinearLayout>
<!-- footer -->
<LinearLayout
android:id="@id/footer"
android:layout_width="match_parent"
android:layout_height="76dip"
android:layout_alignParentBottom="true"
android:background="@drawable/home_footer" >
<!-- end footer -->
</LinearLayout>
</RelativeLayout>
主な問題:まず、通知バーをアニメーション化しました。移動し、アニメーションの最後にスナップして元の位置に戻ります。はい、fillAfterをtrueに設定しました。違いはありません。とにかく、シフトする必要がある3つの項目はクリック可能であり、私が読んだところによると、要素は実際には移動しておらず、移動しているように見えます。
2番目の問題:ビュー全体がRelativeLayoutですが、3つの要素はXMLを介して通知バーの下のlayout_に設定されたLinearLayoutにあります。通知バーをシフトすると、このLinearLayoutが絞り込まれ、それに対応するようにボタンがシフトされることを期待していましたが、そのような運はありませんでした。3つの要素を別々のアニメーションとしてシフトする必要がある場合は、それで問題ありません。私はそれを試しましたが、通知バーと同じ「スナップバック」の問題が発生します。しかし、もっと単純で論理的なアプローチがあることを望んでいました。
このスナップバックの問題に関する投稿をいくつか見つけましたが、どの解決策もうまく機能していません(または、私には意味がありますが、少しおかしなことになります)。onAnimationEndハンドラーで何かが発生する必要があるようです。LayoutParamsを調整することで何かだと思いますが、そこでどのように、何をすべきかわかりません。
私はAPI8(2.2)をターゲットにしているので、HoneycombアニメーションAPIは役に立ちません。有望に見えるNineOldAndroidsを調べましたが、ネイティブAPIを使用してこれを行う方法が必要であると考えています。
**通知バーを閉じることができ、すべてが元の位置に戻ると、ボーナスポイントが得られます。
**更新:次のコードの種類は機能します**
通知バーをスライドさせるアニメーション方法は次のとおりです。
private void showNotification() {
mNotificationBar.setVisibility(View.VISIBLE);
Animation slideOut = AnimationUtils.loadAnimation(this, R.anim.slide_notification_out);
slideOut.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// do nothing
}
@Override
public void onAnimationRepeat(Animation animation) {
// do nothing
}
@Override
public void onAnimationEnd(Animation animation) {
// do SOMETHING
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mNotificationBar.getLayoutParams();
params.addRule(RelativeLayout.BELOW, mHeader.getId());
mNotificationBar.setLayoutParams(params);
mNotificationBar.clearAnimation();
}
});
mNotificationBar.startAnimation(slideOut);
}
AnimationEndでLayoutParamsを変更すると、通知バーが所定の位置に保持されます。そして、アニメーションが完了すると、ボタンのレイアウトが圧迫されて対応します!ただし、ボタンのレイアウトは通知バーのようにスムーズにアニメーション化されるわけではなく、アニメーションの最後にスナップするだけです。また、アニメーションの最後で通知バーも少しジャンプします。レイアウトが再描画されているためだと思います。とても近いですが、これまでのところ。