新しいFacebookアプリには、アプリケーションでそのようなものを使用したいという隠しサイドバーが付属しています。FirefoxMobileのサイドバーのように見えます...
ViewPagerを再実装する以外に、それを実装する方法について何か考えがありますか?私はHorizontalScrollViewを試してみましたが、それはまたそれの再実装につながります...
私はこれらの2つ以外に他の方法を見ていません...何か提案はありますか?
前もって感謝します
新しいFacebookアプリには、アプリケーションでそのようなものを使用したいという隠しサイドバーが付属しています。FirefoxMobileのサイドバーのように見えます...
ViewPagerを再実装する以外に、それを実装する方法について何か考えがありますか?私はHorizontalScrollViewを試してみましたが、それはまたそれの再実装につながります...
私はこれらの2つ以外に他の方法を見ていません...何か提案はありますか?
前もって感謝します
私は解決策を思いついた...それが完璧かどうかはわかりませんが、うまく機能しています。
つまり、両方のレイアウトを積み重ねた単一のFrameLayoutを作成し、上部のレイアウトをアニメーション化して画面の右側にスライドさせます(slideToまたはscrollByを呼び出す必要があります。基本的にはそれです!非常にシンプルで効果的です。 !(コードはあまりきれいではありませんが:P)
編集:
いくつかのコードサンプル。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF" >
<include
android:id="@+id/menu_layout"
layout="@layout/menu_list"
android:visibility="invisible"/>
<include
android:id="@+id/news_list_parent"
layout="@layout/main_news_list"
/>
</FrameLayout>
これはレイアウトxmlであり、非常に単純です。含まれている.xmlは、見出しとリストビューを備えた単純なLinearLayoutsです。
「魔法」はアニメーションで発生します。
protected void applyTransformation(float interpolatedTime, Transformation t) {
int newOffset;
if(expanded) {
newOffset = 0;
newOffset = (int)(endOffset*(1-interpolatedTime));
} else {
newOffset = (int)(endOffset*(interpolatedTime));
}
view.scrollTo(-newOffset, 0);
}
endOffsetはターゲットの動きです。アニメーションを開始する前に設定し、アニメーション化するビュー(この場合はid = news_list_parentのビュー)をコンストラクターに設定します。
しかし、それがどのように機能するかを理解するために、ボタンを作成し、そのリスナーは次のようなことを行います。
if(viewBeneath.getVisibility() == View.INVISIBLE) {
viewBeneath.setVisibility(View.Visible);
viewToSlide.slideTo(-(width-50), 0);
}
そして最後に、戻るボタンをオーバーライドして、ボタンの反対を実行します
if(viewBeneath.getVisibility() == View.VISIBLE) {
viewToSlide.slideTo(0, 0);
viewBeneath.setVisibility(View.Visible);
}
これを擬似コードとして読んでください=)これは私が最初にしたことです、そのコードは失われます:P
これを試すことができます。良い手本。スライダークラスを確認してください。
私は以下のようなことをしました:
以下は、Facebookのサイドメニューバーのようなものの私のコードです
インターフェイスにXMLを使用しませんでした。以下のコードですべてを作成します。読みやすく、日食に入れるのは簡単なはずだと思います。
package com.chaoshen.androidstudy.facebooklikesidemenubar;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity{
private boolean Menu_Displayed=false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Display display = getWindowManager().getDefaultDisplay();
final int width = display.getWidth();
// menu:
LinearLayout li_menu = new LinearLayout(this);
li_menu.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
li_menu.setOrientation(1);//1 is vertical
li_menu.setBackgroundColor(Color.GREEN);
Button btn1 = new Button(this);
btn1.setText("button 1");
btn1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
li_menu.addView(btn1);
//body:
final HorizontalScrollView hsv = new HorizontalScrollView(this){
@Override
// do not let hsv consume the click itself. Then the view under the hsv will also consume the click
//so that the menu will be clicked
//when menu is not showed up, let hsv be the only view to consume the click.
//so that the menu will not be clicked
public boolean onTouchEvent(MotionEvent ev) {
if(Menu_Displayed){
return false;
}
else{
return true;
}
}
};
hsv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
hsv.setBackgroundColor(Color.TRANSPARENT);
hsv.setHorizontalFadingEdgeEnabled(false);
hsv.setVerticalFadingEdgeEnabled(false);
final LinearLayout li_body = new LinearLayout(this);
li_body.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
li_body.setOrientation(0);//0 is horizantal
li_body.setBackgroundColor(Color.TRANSPARENT);
hsv.addView(li_body);
//body: place holder transparent
TextView placeholder = new TextView(this);
placeholder.setTextColor(Color.TRANSPARENT);
placeholder.setLayoutParams(new LayoutParams(width-100, LayoutParams.FILL_PARENT));
placeholder.setVisibility(View.INVISIBLE);
li_body.addView(placeholder);
//body: real content
LinearLayout li_content = new LinearLayout(this);
li_content.setLayoutParams(new LayoutParams(width, LayoutParams.FILL_PARENT));
li_content.setOrientation(1);//1 is vertical
li_content.setBackgroundColor(Color.CYAN);
TextView tv1 = new TextView(this);
tv1.setText("txt 1");
tv1.setTextSize(40);
tv1.setTextColor(Color.BLACK);
TextView tv2 = new TextView(this);
tv2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
tv2.setTextSize(50);
tv2.setText("txt 2");
tv2.setTextColor(Color.WHITE);
//use this button to scroll
Button btn_showMenu = new Button(this);
btn_showMenu.setText("Menu");
btn_showMenu.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
btn_showMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hsv.post(new Runnable() {
@Override
public void run() {
if(Menu_Displayed){
hsv.smoothScrollTo(width-100, 0);
}
else{
hsv.smoothScrollTo(0, 0);
}
Menu_Displayed = !Menu_Displayed;
}
});
}
});
li_content.addView(tv1);
li_content.addView(tv2);
li_content.addView(btn_showMenu);
li_body.addView(li_content);
//add menu and body in to frame
FrameLayout mainFrame = new FrameLayout(this);
mainFrame.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mainFrame.addView(li_menu);
mainFrame.addView(hsv);
//scroll to the body real content to block the menu
hsv.post(new Runnable() {
@Override
public void run() {
hsv.scrollBy(width-100, 0);
}
});
setContentView(mainFrame);
}
}
多くのストックソリューションが古いAndroidバージョンでは機能しないように見えたり、機能させるための適切な手順が不足しているため、私はこれについても独自のソリューションを作成しました。
私のソリューションには次の機能があります。
SlidingMenuLayout
このソリューションでは、 2つのビューを追加することが期待されると呼ばれるカスタムレイアウトを使用します。追加する最初のビューはメニューで、2番目はメインビューです。
既存のプロジェクトにレイアウトを追加する最も簡単な方法は、アクティビティのsetContentView()
メソッドをオーバーライドすることです。
@Override
public void setContentView(View view) {
SlidingMenuLayout layout = new SlidingMenuLayout(this);
layout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT, 0.0F));
layout.addView(new MenuView(this));
layout.addView(view);
super.setContentView(layout);
}
この例では、MenuViewは実際にメニューを表示するビューです。このビューを実装するのはあなた次第です。
openMenu()
最後に、必要に応じて、またはcloseMenu()
レイアウト上に呼び出すボタン(通常はメインビューの左上隅にあります)を追加できます。
のコードSlidingMenuLayout
はGitHubプロジェクトページにあります: