话不多说,源码在此:
using System;
using Android.Content;
using Android.Views;
using Android.Widget;
using Android.Util;
namespace FirstApp.Widget
{
class SlideMenu : HorizontalScrollView
{
/**
* 屏幕宽度
*/
private int mScreenWidth;
/**
* dp
*/
private int mMenuRightPadding = 50;
/**
* 菜单的宽度
*/
private int mMenuWidth;
private int mHalfMenuWidth;
private bool isOpen;
ViewGroup menu;
private Boolean once;
public SlideMenu(Context context, IAttributeSet attribute) : base(context, attribute)
{
mScreenWidth = context.Resources.DisplayMetrics.WidthPixels;
}
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
if (!once)
{
LinearLayout wrapper = (LinearLayout)GetChildAt(0);
menu = (ViewGroup)wrapper.GetChildAt(0);
ViewGroup content = (ViewGroup)wrapper.GetChildAt(1);
// dp to px
mMenuRightPadding = (int)TypedValue.ApplyDimension(
ComplexUnitType.Dip, mMenuRightPadding, content
.Resources.DisplayMetrics);
mMenuWidth = mScreenWidth - mMenuRightPadding;
mHalfMenuWidth = mMenuWidth / 2;
menu.LayoutParameters.Width = mMenuWidth;
content.LayoutParameters.Width = mScreenWidth;
}
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
}
protected override void OnLayout(bool changed, int left, int top, int right, int bottom)
{
base.OnLayout(changed, left, top, right, bottom);
if (changed)
{
// 将菜单隐藏
this.ScrollTo(mMenuWidth, 0);
once = true;
}
}
public override bool OnInterceptTouchEvent(MotionEvent ev)
{
switch (ev.ActionMasked)
{
case MotionEventActions.Down:
if (ev.RawX < 30 && !isOpen)
{
//ev.Action = MotionEventActions.Cancel;
//DispatchTouchEvent(ev);
return true;
}
if (isOpen)
{
return true;
}
break;
}
return false;
}
public override bool OnTouchEvent(MotionEvent ev)
{
MotionEventActions action = ev.ActionMasked;
switch (action)
{
case MotionEventActions.Down:
if (ev.RawX > 30 && !isOpen)
{
ev.Action = MotionEventActions.Cancel;
DispatchTouchEvent(ev);
}
break;
// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
case MotionEventActions.Up:
int scrollX = ScrollX;
if (isOpen)
{
if (scrollX > 2*mMenuWidth / 5)
{
this.SmoothScrollTo(mMenuWidth, 0);
isOpen = false;
}
else
{
this.SmoothScrollTo(0, 0);
}
if(ev.RawX> mMenuWidth && scrollX==0)
{
this.SmoothScrollTo(mMenuWidth, 0);
isOpen = false;
}
}
else
{
if (scrollX < mMenuWidth * 3 / 5)
{
this.SmoothScrollTo(0, 0);
isOpen = true;
}
else
{
this.SmoothScrollTo(mMenuWidth, 0);
}
}
return true;
}
return base.OnTouchEvent(ev);
}
public bool getStatus()
{
return isOpen;
}
public void openMenu()
{
if (isOpen)
{
this.SmoothScrollTo(mMenuWidth, 0);
isOpen = false;
}
}
public void closeMenu()
{
if (!isOpen)
{
this.SmoothScrollTo(0, 0);
isOpen = true;
}
}
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FirstApp.Widget.SlideMenu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:scrollbars="none">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical">
<EditText
android:inputType="textPersonName"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="username"
android:id="@+id/editText1" />
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="password" />
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="确定"
android:id="@+id/btn_sure" />
<ImageView
android:src="@android:drawable/ic_menu_gallery"
android:layout_width="200dp"
android:layout_height="150dp"
android:id="@+id/imageView1" />
<Button
android:text="testDB"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button1" />
<FirstApp.Widget.MyIndicator
android:layout_width="wrap_content"
android:layout_height="40dp"
android:background="#cccccc"
android:id="@+id/indicor" />
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewPager1" />
</LinearLayout>
</LinearLayout>
</FirstApp.Widget.SlideMenu>
注意,必须有一个组件把menu和containt包裹,这是HorizontalScrollView特性决定的。
使用时主要用openMenu()和closeMenu()方法就行了。其它自己具体设置吧。