3

のスライドイン/スライドアウトトグルに次のコードを使用していますAppBarLayout

public void showToolbar(boolean show) {
    if (appBar == null) {
        Log.e(TAG, "showToolbar: Toolbar is null");
        return;
    }
    boolean toolbarShown = Utils.isViewVisible(appBar);
    Log.d(TAG, "showToolbar: shown:" +shown);
    boolean changed = (show != toolbarShown);
    if (changed) {
        if (show) {
            Log.d(TAG, "showToolbar: showing");
            appBar.setVisibility(View.VISIBLE);
            appBar.animate()
                    .translationY(0)
                    .setInterpolator(new DecelerateInterpolator())
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animator) {
                            appBar.setVisibility(View.VISIBLE);
                        }

                        @Override
                        public void onAnimationEnd(Animator animator) { }

                        @Override
                        public void onAnimationCancel(Animator animator) { }

                        @Override
                        public void onAnimationRepeat(Animator animator) { }
                    })
                    .start();
        } else {
            Log.d(TAG, "showToolbar: hiding");
            appBar.animate()
                    .translationY(-toolbar.getBottom())
                    .setInterpolator(new DecelerateInterpolator())
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animator) { }

                        @Override
                        public void onAnimationEnd(Animator animator) {
                            appBar.setVisibility(View.INVISIBLE);
                        }

                        @Override
                        public void onAnimationCancel(Animator animator) { }

                        @Override
                        public void onAnimationRepeat(Animator animator) { }
                    })
                    .start();
        }
    } else {
        Log.d(TAG, "showToolbar: no change");
    }
}

showToolbar(true)ツールバーを表示するために初めて呼び出される場合を除いて、アニメーションは完全に機能します。ビューは、最初はアニメーションなしで表示されます。サイトを精査したところ、同様の質問が見つかりましたが、解決策がうまくいかないようです。

appBarこれは、を最初に非表示にしたい場合にのみ発生することに注意してください。私の推測では、おそらくアニメーションは

更新 1:

public static boolean isViewVisible(View view) {
    if (View.VISIBLE == view.getVisibility()) return true;
    else return false;
}

更新 2

isViewWithinScreenBounds()そのチェックは実際には必要ないため、メソッドを削除しました。

4

2 に答える 2

1

これで試してください

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:translationY="-120dp"
    android:layout_height="120dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SOME TEXT HERE" />
    </android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>

活動コード

@BindView(R.id.app_bar)
AppBarLayout appBar;
@BindView(R.id.toolbar)
Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.some_layout);
    ButterKnife.bind(this);

    setSupportActionBar(toolbar);

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            animateToolbar(false); //Just for testing purpose - delay execute of function animateToolbar() for 4 seconds
        }
    }, 4000);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    animateToolbar(true);
    return super.onCreateOptionsMenu(menu);
}

private void animateToolbar(boolean show) {

    if (show) {
        // As you can see in the xml layout initial position of the appBar is translated by its height to the top of the screen "-" sign
        // Slide int from out of the screen to initial position -> from -120 dp (height of the app bar, see xml) to 0 dp 
        appBar.animate()
                .translationY(0)
                .setDuration(1000)
                .start(); 

    } else {
        // Slide out from initial position to the top of the screen -> from 0 dp to -120 dp (height of the app bar, see xml)
        appBar.animate()
                .translationY(-appBar.getHeight())
                .setDuration(1000)
                .start();
    }
}
于 2016-09-25T13:05:07.110 に答える
1

と には必ず初期値を設定してvisibilityくださいtranslationY

ツールバーを最初に非表示にして最初のアニメーションで表示する場合は、必ずANDandroid:visibility="invisible"NOT "gone"を設定し、負android:translationYの likeを設定して-56dpください。

于 2016-09-25T19:19:33.897 に答える