效果图:

SlideActivity.java:

package com.demo.slide;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.Window;import com.demo.broadcast.R;public class SlideActivity extends Activity{private SlidingMenu mLeftMenu ; @Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.slide_main);mLeftMenu = (SlidingMenu) findViewById(R.id.id_menu);}public void toggleMenu(View view){mLeftMenu.toggle();}}

SlidingMenu.java:

package com.demo.slide;import android.content.Context;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.TypedValue;import android.view.MotionEvent;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;public class SlidingMenu extends HorizontalScrollView{private LinearLayout mWapper;private ViewGroup mMenu;private ViewGroup mContent;private int mScreenWidth;private int mMenuWidth;// dpprivate int mMenuRightPadding = 80;private boolean once;private boolean isOpen;/** * 未使用自定义属性时,调用 *  * @param context * @param attrs */public SlidingMenu(Context context, AttributeSet attrs){this(context, attrs, 0);}/** * 当使用了自定义属性时,会调用此构造方法 *  * @param context * @param attrs * @param defStyle */public SlidingMenu(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth = outMetrics.widthPixels;mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());}public SlidingMenu(Context context){this(context, null);}/** * 设置子View的宽和高 设置自己的宽和高 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){if (!once){mWapper = (LinearLayout) getChildAt(0);mMenu = (ViewGroup) mWapper.getChildAt(0);mContent = (ViewGroup) mWapper.getChildAt(1);mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth- mMenuRightPadding;mContent.getLayoutParams().width = mScreenWidth;once = true;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/** * 通过设置偏移量,将menu隐藏 */@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b){super.onLayout(changed, l, t, r, b);if (changed){this.scrollTo(mMenuWidth, 0);}}@Overridepublic boolean onTouchEvent(MotionEvent ev){int action = ev.getAction();switch (action){case MotionEvent.ACTION_UP:// 隐藏在左边的宽度int scrollX = getScrollX();if (scrollX >= mMenuWidth / 2){this.smoothScrollTo(mMenuWidth, 0);isOpen = false;} else{this.smoothScrollTo(0, 0);isOpen = true;}return true;}return super.onTouchEvent(ev);}/** * 打开菜单 */public void openMenu(){if (isOpen)return;this.smoothScrollTo(0, 0);isOpen = true;}public void closeMenu(){if (!isOpen)return;this.smoothScrollTo(mMenuWidth, 0);isOpen = false;}/** * 切换菜单 */public void toggle(){if (isOpen){closeMenu();} else{openMenu();}}}

slide_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.demo.slide.SlidingMenu        android:id="@+id/id_menu"        android:layout_width="match_parent"        android:layout_height="match_parent" >        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:orientation="horizontal" >            <include layout="@layout/left_menu" />            <LinearLayout                android:layout_width="match_parent"                android:layout_height="match_parent"                android:background="#ffffff" >                <Button                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:onClick="toggleMenu"                    android:text="切换" />                <TextView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_gravity="center"                    android:layout_marginLeft="20dp"                    android:text="我是主content"                    android:textColor="#ff00ff"                    android:textSize="20sp" />            </LinearLayout>        </LinearLayout>    </com.demo.slide.SlidingMenu></RelativeLayout>

left_menu.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#000000" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:orientation="vertical" >        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="20dp"            android:text="我是左侧Menu"            android:textColor="#ffffff"            android:textSize="20sp" />    </LinearLayout></RelativeLayout>

更多相关文章

  1. Android的状态栏通知(Notification)
  2. Android(安卓)RecyclerView 分割线(DividerItemDecoration )
  3. Unity调用Android保存图片到相册
  4. Android点击效果加边框
  5. ANDROID截屏
  6. 在Android(安卓)WebView中设置Cookie
  7. Android(安卓)自定义ProgressBar--进度自己设置图片
  8. 获取Android唯一设备号
  9. Android中onSaveInstanceState和onRestoreInstanceSt...

随机推荐

  1. 在Servlet和HTML页面之间处理函数调用和
  2. Javascript构造函数有什么意义?
  3. 从javascript写入div
  4. 将数据从AJAX请求序列化到PHP
  5. iframe操作、调用父页面元素或js函数
  6. 如何让Require.js获取一个不以`.js`结尾
  7. 饿了么大前端 Node.js 进阶教程
  8. 如何使用显示滚动内容?
  9. 这种解决Fizzbuzz挑战的方式是什么?
  10. 子窗体传值给父窗体