Android Facebookスタイルのスライド


283

新しいFacebookアプリケーションとそのナビゲーションはとてもクールです。私のアプリケーションでそれをどのようにエミュレートできるかを確認しようとしていました。

誰かがそれをどのようにして達成することができるのか手掛かりを持っていますか?

ここに画像の説明を入力してください

左上のボタンをクリックすると、ページスライドと次の画面が表示されます。

ここに画像の説明を入力してください

YouTubeビデオ


2
はい、正確な効果を知るためにビデオも役立ちます。
bool.dev

@ bool.devはここにビデオがあります:youtube.com/watch
Harsha MV

@ HarshaMV:-このスレッドを探してみてください。stackoverflow.com/questions/8453320/...
Shashank_Itmaster

3
Androidのスライドアウトナビゲーションに関する非常に優れた記事-androiduipatterns.com/2012/06/…。必読。
AlexKorovyansky 2012

私は自分のスライドメニューを実装しました。ここを参照してください。stackoverflow.com/ a / 15880375/1939564
Muhammad Babar

回答:


176

私自身もこれを試してみましたが、FrameLayoutを使用してカスタムのHorizo​​ntalScrollView(HSV)をメニューの上に配置するのが最善の方法でした。HSV内にはアプリケーションビューありますが、最初の子として透過ビューあります。これは、HSVのスクロールオフセットがゼロの場合、メニューが表示されることを意味します(意外にもクリック可能です)。

アプリが起動したら、HSVを最初に表示されるアプリケーションビューのオフセットまでスクロールし、メニューを表示したい場合は、スクロールして、透明なビューからメニューを表示します。

コードはここにあり、Launchアクティビティの下の2つのボタン(HorzScrollWithListMenuおよびHorzScrollWithImageMenuと呼ばれます)は、思いつく最高のメニューを表示します。

Androidスライドメニューのデモ

エミュレーターからのスクリーンショット(中央スクロール):

エミュレーターからのスクリーンショット(中央スクロール)

デバイスからのスクリーンショット(フルスクロール)。私のアイコンはFacebookメニューアイコンほど広くないため、メニュービューと「アプリ」ビューは整列していません。

デバイスからのスクリーンショット(フルスクロール)


1
@AmokraneChentir getDrawingCache()非メニューアクティビティを呼び出し、ビットマップからImageViewを作成することで、さまざまなアクティビティを使用できます。次に、クラスのメソッドでstartActivity(intent)overridePendingTransition(0, 0)を呼び出して、新しいアクティビティをすぐに表示し、目的の効果を取得します。onClickClickListenerForScrolling
Siklab.ph

1
Horizo​​ntalScrollViewの公式ドキュメントではListViewに項目全体を表示するよう強制することが記載されているため、カスタムHorizo​​ntalScrollViewをListViewで使用できるかどうか疑問に思います。
シアミ

1
このフォークはフラグメントを使用せずにアクティビティを切り替えます!
Erik B

1
あなたの助けをありがとう、私はHorzScrollWithListMenu.javaを使用することができました。
KarenAnne 2013

2
@PaulGrimeに感謝します...これは非常にシンプルな例であり、最も素晴らしいことは、このデモの中で簡単に理解でき、簡単にカスタマイズでき、使用するライブラリプロジェクトがないことです。
Naveen Kumar 2013

37

このライブラリプロジェクトに Facebookのようなスライドアウトナビゲーションを実装しました。

アプリケーション、UI、ナビゲーションに簡単に組み込むことができます。1つのアクティビティと1つのフラグメントのみを実装する必要があります。それをライブラリに知らせてください。ライブラリは、必要なすべてのアニメーションとナビゲーションを提供します。

リポジトリ内には、libを使用してfacebookのようなナビゲーションを実装する方法とともに、demo-projectがあります。これはデモプロジェクトの記録を含む短いビデオです。

また、このlibは、アクティビティトランザクションとTranslateAnimations(フラグメントトランザクションとカスタムビューではない)に基づいているため、このActionBarパターンと互換性があるはずです。

現在のところ、最も問題なのは、ポートレートモードとランドスケープモードの両方をサポートするアプリケーションでうまく機能させることです。フィードバックがある場合は、githubから提供してください。

最高です、
アレックス


4
こんにちは、私はあなたのアプローチがサイドバーを開くたびに大きなスクリーンショットビットマップを作成することを理解しました。ヒープサイズが大きくなり、メモリ不足エラーが発生する可能性があります。
シアミ

3
korovyanskさん、ありがとうございます。ただし、新しいOSでは絶対レイアウトは非推奨です。もう一度コーディングできますか?
ヘサム

githubまたはここでフィードバックを提供してくださった皆さんに感謝します。私はいくつかのバグについて知っており、アプリを改善するためのアイデアを持っています。暇なときにやります。
AlexKorovyansky

こんにちはコロヤンスク。私はあなたのライブラリを使用していますが、それはうまくいきます。しかし、私は少し問題があります。スライドバーリストを開くと、リストビューアイテムのクリックでアクティビティが開始されます。アクティビティは正しく開始されますが、スライドインアニメーションが機能しません。コード((MenuActivity) getActivity()).getSlideoutHelper().close(); startActivity(new Intent(getActivity(), MyActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra("category", position));
晴れ

あなたの場合、新しいアクティビティはアニメーションの終了を待たずにすぐに開きます。ライブラリを拡張して、アニメーションの終了のためのコールバックを追加することができます。この機能を次のバージョンのライブラリに追加する可能性があります。
AlexKorovyansky 2012

24

ここに別の libがあり、私の意見では最高のようです。書きませんでした。

更新:

このコードは私にとっては最もうまくいくようで、G +アプリと同様にアクションバー全体を動かします。

Googleはどうやってこれを実現したのですか?AndroidアプリケーションでのActionBarのスライド


7
私はこのライブラリを書いた、あなたがそれを気に入ってくれてうれしい。今のところ、これは本当に基本的なことですが、今後数週間で改善する予定です。他の人にも変更を加えることを歓迎します。
David Scott

このライブラリは本当に素晴らしいです。使い方はとても簡単で完璧に動作します。ありがとうございました。このサンプルはICS(および私が思うにHoneycomb)でのみ機能することを付け加えたいのですが、ライブラリは2.1までずっと機能します。問題なく使用しています。
スティーブンエリオット

悪くない、それはかなりシンプルですが、うまく機能し、セットアップは本当に迅速です。ただし、ライブラリの外部からはあまり設定できません。すべてのアイテムは同じシンプルなレイアウトであり、外出先では動的なリスト表示の可能性はありません。どちらも簡単に適応できますが、リスト内でグループ化する必要があるので、それほど簡単ではありません。
htafoya 2013

22

私はFacebookのアプリはネイティブコードで書かれていないと思います(ネイティブコードで私は、Androidでのレイアウトを使用して、平均値)が、彼らはそれのために使用されるのWebViewを持っているなど、いくつかのJavaScriptのUIライブラリを使用している煎茶を。senchaフレームワークを使用して簡単に実現できます。

ここに画像の説明を入力してください


16
+1 UIはアプリの更新なしで変更できるため、間違いなくWebアプリであり、Androidアプリは基本的にWebブラウザーです。
ルディ

7
これが必ずしも当てはまるかどうかはわかりません。UIのスケルトンはネイティブ(実際のメニュービューや他のネイティブビューなど)にすることができ、それらのビューのコンテンツは動的に読み込まれます。アプリのスケルトンが変更された場合、更新が必要になる可能性があります。
Paul Grime、2012年

2
facebookアプリはwebアプリだとは思いません。流暢すぎる、速い。私は「ネイティブのように」見栄えの良いウェブ/ハイブリッドアプリを知っていますが、ネイティブと比較してまだ少し遅れがあります。スケルトンだけでなく、リスト、マップなどもネイティブな外観と感触です。少なくとも現在のテクノロジーの状態では。
Ixx

わかりました。誰かがこのアプリを2か月間このようにしていないと言ったので、あなたは私が知らない古いバージョンを参照しています。とにかく、現在のアプリが間違いなくネイティブであることをコメントすることは有益かもしれません。
Ixx

20

これがまた別の(とても良い)オープンソースライブラリです!

この機能の優れた点は、ActionBarSherlockと簡単に統合できることです。

ここにgithubプロジェクトのリンクがあります

こちらがGoogle Playのダウンロードリンクです


2
私はこれが最高だと思います
Harsha MV

17

私は自分のプロジェクトに同様のビューを実装しました。ここで確認できます

これは私が書いたライブラリに基づくサンプルアプリケーションの画面です。 ActionsContentViewの例

このカスタムビューは、XMLレイアウトの要素として簡単に使用できます。次に例を示します。

    <shared.ui.actionscontentview.ActionsContentView
      android:id="@+id/content"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:actions_layout="@layout/actions"
      app:content_layout="@layout/content" />

ActionsContentViewライブラリの使用法について質問があります。プロジェクトWikiで小さな記事を書くことができます。

このライブラリのいくつかの利点:

  • タッチでビューをスライドする機能
  • XMLでアクションバーのサイズを調整するのは簡単です
  • 2.0以降のすべてのAndroid SDKバージョンのサポート

制限が1つあります。

  • すべての水平スクロールビューは、このビューの境界では機能しません

よろしく、スティーブン


フリストUIをアップロード写真として設定する方法は?最初のUIが画面上のwebViewであることをテストします。アプリが起動したときにリストビューが表示されることを願っています。あなたのlibを通じて2.0ですが、あなたのデモは4.0ですが、私はあなたにもクールです2.0.that使用することを願って
pengwang

@pengwang:この機能をサポートするためにいくつかのコードをプッシュしました。これは、Activity.onResume()の実行中に、viewActionsContentView.showActions();を呼び出すことで実行できます。
失礼

非表示部分のタッチイベントを無効にすることはできますか?たとえば、右側のパーツがアクティブな場合、右側のすべてのビューが無効になります。
Valeriy

アクション1が表示されている間、コンテンツのレイアウトをブロックする可能性があります。サンプルプロジェクトをメールで送りました。
失礼

16

Androidサポートパッケージリビジョン13(2013年5月)では、ウィンドウの端からプルできるナビゲーションドロワーを作成するためのDrawerLayoutがあります。そして今、ナビゲーションドロワーはデザインパターンです。

v4サポートライブラリ

ナビゲーションドロワーデザインパターン


2
はい、サポートされている最小APIレベルは4です
Wubao Li

1
また、互換性ライブラリを使用すると、古いデバイスで使用できます。私はジンジャーブレッド以降のためにそれを開発しました。
Tony Maro

2
これはさらに上にする必要があります。他の回答では、無​​関係のサードパーティライブラリが多すぎます。
Jason Axelson 2013年

15

既存の実装のまとめを行い、それをライブラリプロジェクトとサンプルアプリに変えました。また、XML解析と、存在する可能性のあるアクションバーの自動検出も追加されたため、ネイティブだけでなく、ActionBarSherlockなどのサポートアクションバーでも動作します。

これもまたアクションバーをスライドさせます!

全体は、サンプルアプリを含むライブラリプロジェクトであり、GoogleアプリやFacebookアプリのようなAndroid向けのスライドメニューで説明されています。最初のアイデアとコードを提供してくれたsciroccoに感謝します。

ジンジャーブレッドのSlideMenu ActionBarを使用したICSのSlideMenu


10

これはシンプルでエレガントです:https : //github.com/akotoe/android-slide-out-menu.git

スナップショット:

ここに画像の説明を入力してください


手伝って頂けますか??スライダーに関連する質問は...ここでリンクされstackoverflow.com/questions/14500927/...
moDev

タッチしてスライドできる?(平均スワイプ)
alicanbatur 2013年

@エドワード私はあなたのサンプルで作業してきました、私は素晴らしいと使いやすいと思いますが、画面を回転させるときに問題が発生しました(私はandroid 3.1のマニフェストでandroid:configChanges = "orientation"を使用していますアクティビティを再開したい場合)画面は正常に回転しますが、フレームレイアウトはそのサイズを維持し、見栄えがよくありません。これを回避する方法はありますか?私はすべてを試しましたが、修正できません。感謝
zvzej 2013年

@Edwardここにあなたのサンプルを使用した私の質問があります。私を助けてください、または私にいくつかのアドバイスをお願いします。stackoverflow.com/questions/16778911/...
zvzej


8

@Paul Grimeの回答にはまだコメントできませんが、とにかく私は彼のgithubプロジェクトにフリッカー問題の修正を提出しました...

ここに修正を投稿します。多分誰かがそれを必要としています。2行のコードを追加するだけです。anim.setAnimationListener呼び出しの下の最初のもの:

anim.setFillAfter(true);

そして、app.layout()呼び出しの後の2番目のもの:

app.clearAnimation();

お役に立てれば :)


6

これをAbsoluteLayoutと、ビューを負のオフセットに移動して非表示にする単純なスライドコントローラーで実装しました。

誰か興味があれば、コード/レイアウトを整理して投稿できます。AbsoluteLayoutは廃止予定ですが、非常に単純な実装でした。左側面図/右側面図、および「スライドして開く」ときは、左側面図を-Xオフセットからデバイスの幅に移動します。右側面図に表示するものは何でもかまいません。


あなたがAbsoluteLayoutなしでそれを行うことができれば私は感謝します!ありがとう!
イゴール


3

私のAndroid共通ライブラリ(ACL)の一部として、独自のサイドバーを実装しました。主な利点:

  1. サイドバーは任意の位置に設定できます:左、上、下、右
  2. メインビューとスライドビューの両方がクリック可能です
  3. サイドバーは部分的に表示できます
  4. サイドバーのスタイル可能な属性により、スタイルを簡単に変更できます
  5. Mavenリポジトリのアーティファクト
  6. 大きな図書館の一部

ソースコード:https : //github.com/serso/android-common/tree/master/views/src/main/java/org/solovyev/android/view/sidebar

使用法:https : //github.com/serso/android-common/blob/master/samples/res/layout/acl_view_layout.xml


3

最近、スライディングメニューの実装バージョンに取り組みました。人気のあるJ.Feinstein AndroidライブラリーSlidingMenuを使用します。

GitHubでソースコードを確認してください:

https://github.com/baruckis/Android-SlidingMenuImplementation

アプリをデバイスに直接ダウンロードして試してください:

https://play.google.com/store/apps/details?id=com.baruckis.SlidingMenuImplementation

コメントのため、コードは自明です。お役に立てれば幸いです。;)


3

私はそれとその働きのための最も簡単な方法を見つけました。シンプルなナビゲーションドロワーを使用して、drawer.setdrawerListner()を呼び出し、mainView.setX()メソッドを以下の引き出しスライドメソッドで使用するか、コードをコピーします。

xmlファイル

 <android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" >

<RelativeLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">

  <ImageView
      android:layout_width="40dp"
      android:layout_height="40dp"
      android:id="@+id/menu"
      android:layout_alignParentTop="true"
      android:layout_alignParentLeft="true"
      android:layout_marginTop="10dp"
      android:layout_marginLeft="10dp"
      android:src="@drawable/black_line"
      />
</RelativeLayout>


<RelativeLayout
    android:id="@+id/left_drawer"
    android:layout_width="200dp"
    android:background="#181D21"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    >
    </RelativeLayout>
 </android.support.v4.widget.DrawerLayout>

Javaファイル

   public class MainActivity extends AppCompatActivity {
DrawerLayout drawerLayout;
RelativeLayout mainView;
ImageView menu;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    menu=(ImageView)findViewById(R.id.menu);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mainView=(RelativeLayout)findViewById(R.id.content_frame);

    menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            drawerLayout.openDrawer(Gravity.LEFT);
        }
    });

    drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            mainView.setX(slideOffset * 300);
        }

        @Override
        public void onDrawerOpened(View drawerView) {

        }

        @Override
        public void onDrawerClosed(View drawerView) {

        }

        @Override
        public void onDrawerStateChanged(int newState) {

        }
    });
 }
}

ここに画像の説明を入力してください

ありがとうございました


2

ここで大胆な推測をします...

表示されないメニューを表すレイアウトがあると思います。メニューボタンがタップされると、レイアウト/ビューをアニメーション表示して邪魔にならないようにし、メニューレイアウトの表示を有効にします。私はこれがビューで何らかのz-indexの問題を引き起こすことや、それらがそれをどのように制御するかについては考えていません。


アプリを使用した場合、実際にはレイアウトが右にスライドしてメニューセクションに移動していることがわかります。動画を作ってアップロードします。
Harsha MV

1
私はiPhoneのバージョンを使用していますが、Androidのバージョンが同じである場合は、私が説明したものとは大きく異なると思います。私はAndroidでアニメーションをあまり書いていないので、アニメーションコードがどのように見えるのかを伝えることはできませんでしたが、大まかに言えば、私が説明したものだと思います。
jlindenbaum

ありがとう、youtube.com / watchv = ANLMaL7zn20 iPhoneでも同じ効果があります。
Harsha MV


2

これは、公式のAndroidドキュメントにある設計および開発ガイドです。非公式の外部ライブラリを追加する必要はありません。Androidサポートライブラリのみが行います。ここでリンクを見つけてください。

設計および開発


1

Facebook Androidアプリは、おそらくFragmentsでビルドされています。メニューは片方のフラグメントで、詳細なアクティビティ(ニュースフィード/イベント/友達など)はもう片方のフラグメントです。基本的に、スマートフォンのタブレットの「マスター&ディテール」レイアウト。


この場合、フラグメント内にアクションバーを作成する必要があるため、Androidフレームワークの機能を使用してビルドすることはできません。実際にはFacebookについては確信が持てませんが、多くの開発者にとって、フレームワークの助けなしにアクションバーを作成するのは難しい方法です。今回はもう終わっているといいのですが。
AlexKorovyansky 2012

1

ちなみに、互換性ライブラリは1.6で始まり、このFacebookアプリはAndroid 1.5搭載のデバイスでも実行されているため、Fragmentsでは実行できませんでした。

それを行う方法は次のとおりです。「基本」アクティビティBaseMenuActivityを作成します。ここで、メニューリストのonItemClickListenerのすべてのロジックを配置し、2つのアニメーション(「開く」と「閉じる」)を定義します。アニメーションの最後/最初に、BaseMenuActivityのレイアウトを表示/非表示にします(これをmenu_layoutと呼びます)。このアクティビティのレイアウトはシンプルで、アイテムとリストの右側にある透明な部分を含む唯一のリストです。この部分はクリック可能で、その幅は「移動ボタン」と同じ幅になります。これで、このレイアウトをクリックしてアニメーションを開始し、content_layoutを左にスライドさせて画面全体を表示できるようになります。オプション(メニューリストの項目)ごとに、BaseMenuActivityを拡張する「ContentActivity」を作成します。次に、リストの項目をクリックすると、メニューが表示された状態でItemSelectedContentActivityが開始されます(アクティビティが開始するとすぐにメニューが閉じます)。各ContentActivityのレイアウトはFrameLayoutであり、およびが含まれます。content_layoutを移動して、必要なときにmenu_layoutを表示するだけです。

それはそれを行う方法であり、私は十分に明確になっていれば幸いです。


1

私は過去数日間、これを試していましたが、結局のところ、非常に簡単で、Honeycombより前に機能するソリューションを考え出しました。私の解決策は、スライドしたいビューをアニメーション化し(FrameLayout私にとって)、アニメーションの終わり(ビューの左/右の位置をオフセットするポイント)をリッスンすることでした。私のソリューションをここに貼り付けました:ビューの翻訳をアニメーション化する方法


1

数時間検索した後、ポールグライムのソリューションがおそらく最良のものであることがわかりました。ただし、機能が多すぎます。だから初心者には勉強が難しいかもしれません。したがって、Paulのアイデアに基づいた実装を提供したいと思いますが、それはよりシンプルで読みやすいはずです。

XMLなしのJavaコードを使用したサイドメニューバーの実装


1

上記の回答のどこかに言及されている素晴らしいSimonVT / android-menudrawerは見当たりませんでした。だからここにリンクがあります

https://github.com/SimonVT/android-menudrawer

とても使いやすく、左、右、上、または下に置くことができます。サンプルコードとApache 2.0ライセンスで十分に文書化されています。


0

2012年6月に、GoogleはEclipse ADTプラグイン「テンプレート」を追加しました。「マスター/詳細フロー」と呼ばれるテンプレートがあり、これを正確に実行します(フラグメントに基づいて)


1
マスター/詳細フローは、問題のサイドバーメニューではありません。これは、一緒に表示される(タブレット)または個別に表示される(電話)2つのフラグメントです。
2013

さて、2013年6月に、ナビゲーションドロワーレイアウトが追加されました。これは、ここで必要となるものに似ていますが、Facebookスタイルのスライダーバーが必要なため、アクションバーはドロワーでスライドしません。
Khulja Sim Sim 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.