Xamarin.android 抽屉效果(SlideMenu)

话不多说,源码在此:

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;
			}
		}
	
	}
}

布局文件:



    
        
        
            
            
            

注意,必须有一个组件把menu和containt包裹,这是HorizontalScrollView特性决定的。

使用时主要用openMenu()和closeMenu()方法就行了。其它自己具体设置吧。


你可能感兴趣的:(安卓,xamarin)