web-dev-qa-db-ja.com

可視ハンドルでDrawerLayoutを実装する方法

アプリケーションにNavigationDrawerを正常に実装しました。

私のアプリは、画面の左側に開く引き出しを表示します。

私の問題は、左側にボタンを追加する必要があることです。そのボタンをクリックまたはスワイプすると、左の引き出しが開きます。私ができること。

しかし、ボタンはのように見えるになっているはずです。これは、画面にオーバーフローするドロワーの一部です。

つまり、引き出しが開閉すると同時にボタンがスライドします。

閉鎖状態:

enter image description here

開始状態

enter image description here

左のドロワーのレイアウトにボタンを追加してみましたが、境界線の外にものを表示することはできず、ドロワーを閉じると常に完全に非表示になります。

今、それを追加して、メインのDrawerLayoutにボタンを追加し、それを左の引き出しの右側に揃えるようにしています...しかし、うまくいきません... DrawerLayoutは、子を2つしか持てないようです。 。

任意の助けをいただければ幸いです。

サポートライブラリ(v4)を使用しています

[編集] APIレベル8をサポートしています... ImageView.setTranslationXまたはView.OnAttachStateChangeListenerは使用できません

31
Armel Larcier

Mobistry(SO pseudo)によって作成されたAniqroidライブラリのおかげで、これをかなり簡単に行う方法を見つけました

Android SlidingDrawerのコピーであるSlidingTrayクラスを使用していますが、画面の任意のコーナーに引き出しを配置できます。

Xmlを介して要素を宣言しました

<com.sileria.Android.view.SlidingTray 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer"
    Android:layout_width="match_parent"
    Android:layout_height="270dp"
    Android:content="@+id/content"
    Android:handle="@+id/handle" >

    <ImageView
        Android:id="@+id/handle"
        Android:layout_width="320dp"
        Android:layout_height="24dp"
        Android:background="@drawable/tray_btn" />

    <LinearLayout
        Android:id="@+id/content"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:gravity="fill_vertical"
        Android:orientation="vertical" >
    </LinearLayout>

</com.sileria.Android.view.SlidingTray>

そしてただ電話をしなければならなかった

Kit.init(this);

メインActivityでレイアウトを拡張する前に。

Aniqroid開発者に感謝します!

https://code.google.com/p/aniqroid/

6
Armel Larcier

それはかなりトリッキーです。

これは、新しいGoogleマップアプリの引き出しハンドルに対して行われる処理と似ていると思います。わからない。 :)

Activityコンテンツビューのエッジにとどまるトグルを作成しました。 DrawerLayoutがドラッグされると、最小の子(DrawerLayoutコンテンツビュー)からシャドウ(ある場合)を引いた量だけ、x軸のビューを変換しました。影付けされた+ DrawerLayoutのコンテンツビューは、引き出し全体の測定された幅全体を示します。

スライドしたオフセットと最小の子をすばやく乗算して、x変換を見つけます。

[編集:読みやすくするためにコードを削除し、以下のリンクに移動しました]

あなたの活動では:

_mDrawerToggle = new DrawerLayoutEdgeToggle(
    this, 
    mDrawerLayout, 
    R.drawable.ic_launcher, 
    R.drawable.ic_launcher,
    Gravity.LEFT, 
    true) {

        @Override
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view); //must call super
        }

        @Override
        public void onDrawerOpened(View view) {
            super.onDrawerOpened(view); //must call super
        }

        @Override
        public void onDrawerSlide(View view, float slideOffset) {
            super.onDrawerSlide(view, slideOffset); //must call super

        }
    };
mDrawerLayout.setDrawerListener(mDrawerToggle);
_

創造性の向上:ActionBarからハンドルまでのマージンとして設定できる距離などの外観を追加できます。

また、Y軸を平行移動するだけで、ハンドルを左/右に沿って上下に動かして、「シングルジッパー効果」を模倣できます。 :)

編集:これは私の GitHubで入手できます

編集2:ハンドルを取得できない場合は、最初にmDrawerToggle.setVerticalPostionOffset(0)を使用してください。

12