-1

我想知道如何进行布局,例如在 Facebook 应用程序中。我明白,不仅我一个人在寻找它,而且我无法找到正确的单词让搜索系统找到它。并且可能在这里有人会给我一个带有示例代码的良好链接。我喜欢一个菜单,它从他们的应用程序的左侧显示。

4

2 回答 2

2

您可以访问下面您喜欢的任何此链接,有很多可用的文档和教程。

  1. Android滑动菜单演示
  2. 适用于 Android 的类似 Facebook 的滑出式导航
  3. 如何创建一个滑入式菜单列表,就像在 Facebook 应用程序中一样

希望它会帮助你。

于 2013-07-19T05:04:22.837 回答
0

如果您需要一个简单但有效的,那么您可以查看代码。我在上一个项目中使用它。你可以在这里下载完整的源代码。如果对您有帮助,您也可以查看我的博客。

主布局:res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<com.banglardin.test_code.SlidingView
xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width ="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"        
android:id="@+id/list_activity_layout"  >

<!-- Just make your sliding layout here -->
<LinearLayout 
android:layout_width ="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"       
android:background="#FF34495E"      
android:id="@+id/slide_bar_list_activity" >  
<!-- All the layout of sliding goes here -->



</LinearLayout>


<!-- Just make your content layout here -->
<LinearLayout 
android:layout_width ="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"       
android:background="#FF112131"      
android:id="@+id/content_bar_list_activity" >  
<!-- All the layout of content goes here -->



<RelativeLayout 
    android:id = "@+id/head1"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:layout_alignParentTop = "true"
    android:background="#336699"
    android:maxWidth="48dp" >

    <ImageButton
    android:id ="@+id/main_menu_action_left_of_lable"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_alignParentLeft = "true"
    android:layout_centerVertical ="true"
    android:layout_weight="1"
    android:src="@drawable/option_menu"
    android:background="@drawable/all_image_button_press"
    android:padding="5dp"/>
    <!-- Title lable Of home bar.  -->
    <TextView
    android:id ="@+id/main_toptext"
    android:layout_width = "fill_parent"
    android:layout_height = "wrap_content"
    android:gravity="center"
    android:layout_weight="2"
    android:shadowDy=".4"
    android:shadowDx=".4"
    android:clickable="true"
    android:shadowRadius=".7"
    android:shadowColor="#000000"
    android:textColor = "#ffffff"
    android:layout_toRightOf="@+id/main_menu_action_left_of_lable"
    android:layout_toLeftOf="@+id/main_right_of_lable"
    android:layout_centerInParent ="true"
    android:textSize = "18dp"
    android:layout_centerVertical ="true"
    android:padding="5dp"
    android:text = " Shiba prasad jana "
    android:singleLine = "true"/>
    <!-- Search -->
    <ImageButton
    android:id ="@+id/main_right_of_lable"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_alignParentRight = "true"
    android:layout_centerVertical ="true"
    android:layout_weight="1"
    android:src="@drawable/search_icon"
    android:background="@drawable/all_image_button_press"
    android:padding="5dp"/>
</RelativeLayout>

</LinearLayout>

MainActivity:src/package_name/MainActivity

package com.banglardin.test_code;

import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;

public class MainActivity extends Activity implements SlidingView.Listener {

protected SlidingView mSlidingView;
protected ImageButton menu;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
mSlidingView=(SlidingView)findViewById(R.id.list_activity_layout);
mSlidingView.setListener(this);
menu = (ImageButton) findViewById(R.id.main_menu_action_left_of_lable);
menu.setOnClickListener(new View.OnClickListener(){
    public void onClick(View p1){
    mSlidingView.toggleSidebar();
    }     
    }
    );  

}

public void onSidebarOpened() {

}

public void onSidebarClosed() {
}

public boolean onContentTouchedWhenOpening() {
return false;
}
} 

滑动视图:src/package_name/SlidingView

package com.banglardin.test_code;

import android.util.*;
import android.view.*;
import android.view.animation.*;
import android.content.Context;


public class SlidingView extends ViewGroup {

public final static int DURATION = 400; // time to show slding animation

protected boolean mPlaceLeft = true;
protected boolean mOpened;
protected View mSidebar;
protected View mContent;
protected int mSidebarWidth =-1; /* assign default value. It will be overwrite
 in onMeasure by Layout xml resource. */

protected Animation mAnimation;
protected OpenListener    mOpenListener;
protected CloseListener   mCloseListener;
protected Listener mListener;

protected boolean mPressed = false;

public SlidingView(Context context) {
    this(context, null);
int mSidebarWidth = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50, getResources().getDisplayMetrics());
}

public SlidingView
(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public void onFinishInflate() {
    super.onFinishInflate();
    mSidebar = findViewById(R.id.slide_bar_list_activity);
    mContent = findViewById(R.id.content_bar_list_activity);

    if (mSidebar == null) {
        throw new NullPointerException("no view id = animation_sidebar");
    }

    if (mContent == null) {
        throw new NullPointerException("no view id = animation_content");
    }

    mOpenListener = new OpenListener(mSidebar, mContent);
    mCloseListener = new CloseListener(mSidebar, mContent);
}

@Override
public void onLayout(boolean changed, int l, int t, int r, int b) {
    /* the title bar assign top padding, drop it */
    int sidebarLeft = l;
    if (!mPlaceLeft) {
        sidebarLeft = r - mSidebarWidth;
    }
    mSidebar.layout(sidebarLeft,
        0,
        sidebarLeft + mSidebarWidth,
        0 + mSidebar.getMeasuredHeight());

    if (mOpened) {
        if (mPlaceLeft) {
            mContent.layout(l + mSidebarWidth, 0, r + mSidebarWidth, b);
        } else  {
            mContent.layout(l - mSidebarWidth, 0, r - mSidebarWidth, b);
        }
    } else {
        mContent.layout(l, 0, r, b);
    }
}

@Override
public void onMeasure(int w, int h) {
    super.onMeasure(w, h);
    super.measureChildren(w, h);
    mSidebarWidth = mSidebar.getMeasuredWidth();
}

@Override
protected void measureChild(View child, int parentWSpec, int parentHSpec) {
    /* the max width of Sidebar is 90% of Parent */
    if (child == mSidebar) {
        int mode = MeasureSpec.getMode(parentWSpec);
        int width = (int)(getMeasuredWidth() * 0.9);
        super.measureChild(child, MeasureSpec.makeMeasureSpec(width, mode), parentHSpec);
    } else {
        super.measureChild(child, parentWSpec, parentHSpec);
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (!isOpening()) {
        return false;
    }

    int action = ev.getAction();

    if (action != MotionEvent.ACTION_UP
    && action != MotionEvent.ACTION_DOWN) {
        return false;
    }

    /* if user press and release both on Content while
     * sidebar is opening, call listener. otherwise, pass
     * the event to child. */
    int x = (int)ev.getX();
    int y = (int)ev.getY();
    if (mContent.getLeft() < x
    && mContent.getRight() > x
    && mContent.getTop() < y
    && mContent.getBottom() > y) {
        if (action == MotionEvent.ACTION_DOWN) {
            mPressed = false;
        }

        if (mPressed
    && action == MotionEvent.ACTION_UP
    && mListener != null) {
            mPressed = false;
            return mListener.onContentTouchedWhenOpening();
        }
    } else {
        mPressed = false;
    }

    return false;
}

public void setListener(Listener l) {
    mListener = l;
}

/* to see if the Sidebar is visible */
public boolean isOpening() {
    return mOpened;
}

public void toggleSidebar() {
    if (mContent.getAnimation() != null) {
        return;
    }

    if (mOpened) {
        /* opened, make close animation*/
        if (mPlaceLeft) {
            mAnimation = new TranslateAnimation(0, -mSidebarWidth, 0, 0);
        } else {
            mAnimation = new TranslateAnimation(0, mSidebarWidth, 0, 0);
        }
        mAnimation.setAnimationListener(mCloseListener);
    } else {
        /* not opened, make open animation */
        if (mPlaceLeft) {
            mAnimation = new TranslateAnimation(0, mSidebarWidth, 0, 0);
        } else {
            mAnimation = new TranslateAnimation(0, -mSidebarWidth, 0, 0);
        }
        mAnimation.setAnimationListener(mOpenListener);
    }
    mAnimation.setDuration(DURATION);
    mAnimation.setFillAfter(true);
    mAnimation.setFillEnabled(true);
    mContent.startAnimation(mAnimation);
}

public void openSidebar() {
    if (!mOpened) {
        toggleSidebar();
    }
}

public void closeSidebar() {
    if (mOpened) {
        toggleSidebar();
    }
}

class OpenListener implements Animation.AnimationListener {
    View iSidebar;
    View iContent;

    OpenListener(View sidebar, View content) {
        iSidebar = sidebar;
        iContent = content;
    }

    public void onAnimationRepeat(Animation animation) {
    }

    public void onAnimationStart(Animation animation) {
        iSidebar.setVisibility(View.VISIBLE);
    }

    public void onAnimationEnd(Animation animation) {
        iContent.clearAnimation();
        mOpened = !mOpened;
        requestLayout();
        if (mListener != null) {
            mListener.onSidebarOpened();
        }
    }
}

class CloseListener implements Animation.AnimationListener {
    View iSidebar;
    View iContent;

    CloseListener(View sidebar, View content) {
        iSidebar = sidebar;
        iContent = content;
    }

    public void onAnimationRepeat(Animation animation) {
    }
    public void onAnimationStart(Animation animation) {
    }

    public void onAnimationEnd(Animation animation) {
        iContent.clearAnimation();
        iSidebar.setVisibility(View.INVISIBLE);
        mOpened = !mOpened;
        requestLayout();
        if (mListener != null) {
            mListener.onSidebarClosed();
        }
    }
}

public interface Listener
{
    public void onSidebarOpened();
    public void onSidebarClosed();
    public boolean onContentTouchedWhenOpening();
}

}

于 2013-07-19T06:25:28.660 回答