1

私はこれに対する答えを何日も探していました。いくつかのことはうまくいく(そしてほとんどはうまくいかない)一方で、私がやろうとしていることのベストプラクティスを見つけられることを望んでいます。

アプリに表示する通知バーを取得しようとしています。理想的には、レイアウト内の他の要素をシフトしながら、上から下にスライドします。役立つイラストは次のとおりです。イラスト

レイアウトの構造は次のとおりです(簡潔にするために少し省略しました)。

<?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を変更すると、通知バーが所定の位置に保持されます。そして、アニメーションが完了すると、ボタンのレイアウトが圧迫されて対応します!ただし、ボタンのレイアウトは通知バーのようにスムーズにアニメーション化されるわけではなく、アニメーションの最後にスナップするだけです。また、アニメーションの最後で通知バーも少しジャンプします。レイアウトが再描画されているためだと思います。とても近いですが、これまでのところ。

4

1 に答える 1

1

Snap back problem

レイアウトに表示する最終的な場所で通知を定義する必要があります。あなたにとって、それはおそらくLinearLayoutあなたが上で参照した最初の項目としてです。次に、に設定visibilitygoneます。

最後に、次のようなコードを使用します(ボタンを画面にアニメーション化するために使用しています)。

private void buttonFadeOut() {
        linear_layout_buttons.startAnimation(AnimationUtils.loadAnimation(MyMapActivity.this, android.R.anim.slide_out_right));
        linear_layout_buttons.setVisibility(View.GONE);
}


private void buttonFadeIn() {
    if(linear_layout_buttons.getVisibility() == View.GONE){
        linear_layout_buttons.startAnimation(AnimationUtils.loadAnimation(MyMapActivity.this, R.anim.slide_in_right));
        linear_layout_buttons.setVisibility(View.VISIBLE);
    }
}

Squeeze problem

これは私がアニメーションで試したことはありませんがandroid:layout_weight="1.0"、相対レイアウトの各アイテムにを設定して、使用可能なスペースをそれらの間で均等に分割する(または値を試してそれぞれに異なるスペースを割り当てる)ことができます。

よろしく。

于 2012-11-12T23:42:43.323 に答える