using System;
|
using Android.Content;
|
using Android.Views;
|
using Android.Support.V4.View;
|
using Android.Widget;
|
using Android.Support.V4.Widget;
|
|
|
namespace Shared
|
{
|
/// <summary>
|
/// 右滑抽屉View
|
/// </summary>
|
public class UIDrawerLayout : ViewGroup
|
{
|
AndroidDrawerLayout androidDrawerLayout;
|
|
/// <summary>
|
/// 宽度设置或读取
|
/// </summary>
|
/// <value>The width.</value>
|
public override int Width
|
{
|
get
|
{
|
return base.Width;
|
}
|
set
|
{
|
base.Width = value;
|
if (!IsCanRefresh)
|
{
|
return;
|
}
|
var layoutParameters = androidDrawerLayout.LayoutParameters;
|
layoutParameters.Width = Width;
|
androidDrawerLayout.LayoutParameters = layoutParameters;
|
}
|
}
|
|
/// <summary>
|
/// 视图高度
|
/// </summary>
|
/// <value>The height.</value>
|
public override int Height
|
{
|
get
|
{
|
return base.Height;
|
}
|
set
|
{
|
base.Height = value;
|
if (!IsCanRefresh)
|
{
|
return;
|
}
|
var layoutParameters = androidDrawerLayout.LayoutParameters;
|
layoutParameters.Height = Height;
|
androidDrawerLayout.LayoutParameters = layoutParameters;
|
}
|
}
|
|
LinearLayout leftLinarLayout;
|
|
Android.Widget.FrameLayout mainLinarLayout;
|
|
/// <summary>
|
/// 在滑动事件下,可显示隐藏些自定义视图
|
/// </summary>
|
public UIDrawerLayout()
|
{
|
//viewGroup = new Android.Widget.FrameLayout(Application.Activity);
|
androidDrawerLayout = new AndroidDrawerLayout(Application.Activity, this) { };
|
|
viewGroup = androidDrawerLayout;
|
|
leftLinarLayout = new LinearLayout(Application.Activity) { Alpha = 1.0f };
|
mainLinarLayout = new Android.Widget.FrameLayout(Application.Activity) { Alpha = 1.0f };
|
|
//viewGroup.AddView(androidDrawerLayout, new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.MatchParent, DrawerLayout.LayoutParams.MatchParent));
|
realViewGroup = mainLinarLayout;
|
|
DrawerLayout.LayoutParams lp = new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.MatchParent, DrawerLayout.LayoutParams.MatchParent);
|
androidDrawerLayout.AddView(mainLinarLayout, lp);
|
|
|
DrawerLayout.LayoutParams lp2 = new DrawerLayout.LayoutParams(Application.CurrentWidth, DrawerLayout.LayoutParams.MatchParent);
|
lp2.Gravity = GravityCompat.Start;
|
androidDrawerLayout.AddView(leftLinarLayout, lp2);
|
|
|
|
}
|
|
/// <summary>
|
/// 是否锁定右滑功能, 锁定后右滑弹出菜单失效
|
/// </summary>
|
bool _IsDrawerLockMode;
|
public bool IsDrawerLockMode
|
{
|
get
{
return _IsDrawerLockMode;
}
|
set
|
{
|
_IsDrawerLockMode = value;
|
if (_IsDrawerLockMode)
|
{
|
androidDrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed);
|
}
|
else
|
{
|
androidDrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked);
|
}
|
}
|
}
|
|
|
|
/// <summary>
|
/// 打开抽屉view
|
/// </summary>
|
public void OpenLeftMenu()
|
{
|
|
if (!androidDrawerLayout.IsDrawerOpen(GravityCompat.Start))
|
{
|
androidDrawerLayout.OpenDrawer(GravityCompat.Start);
|
}
|
//Shared.HDLUtils.WriteLine("DrawerLayout:OpenLeftMenu");
|
}
|
|
|
|
/// <summary>
|
/// 关闭抽屉view
|
/// </summary>
|
public void CloseLeftMenu()
|
{
|
if (androidDrawerLayout.IsDrawerOpen(GravityCompat.Start))
|
{
|
androidDrawerLayout.CloseDrawer(GravityCompat.Start);
|
}
|
|
//Shared.HDLUtils.WriteLine("DrawerLayout:CloseLeftMenu");
|
}
|
|
|
|
|
|
|
/// <summary>
|
/// 增加左边视图
|
/// </summary>
|
/// <param name="view">View.</param>
|
public void AddLeftView(View view)
|
{
|
|
view.Parent = this;
|
if (view.AndroidView.Parent != null)
|
{
|
(view.AndroidView.Parent as Android.Views.ViewGroup)?.RemoveView(view.AndroidView);
|
}
|
leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(leftLinarLayout.LayoutParameters.Width, leftLinarLayout.LayoutParameters.Height));
|
|
//view.Width = leftLinarLayout.LayoutParameters.Width;
|
//view.Height = leftLinarLayout.LayoutParameters.Height;
|
//view.Refresh();
|
|
}
|
|
/// <summary>
|
/// RemoveLeftView
|
/// </summary>
|
public void LeftViewRemoveAllViews()
|
{
|
if (leftLinarLayout == null) return;
|
leftLinarLayout.RemoveAllViews();
|
}
|
|
|
|
|
class AndroidDrawerLayout : DrawerLayout
|
{
|
View _view;
|
int mTouchSlop
|
{
|
get
|
{
|
var configuration = ViewConfiguration.Get(Context);
|
//最小的滑动距离
|
return configuration.ScaledTouchSlop;
|
}
|
}
|
public AndroidDrawerLayout(Context context, View view)
|
: base(context)
|
{
|
_view = view;
|
|
}
|
|
//float mLastX, mLastY;
|
////internal bool isShowLeft;
|
////internal bool isShowRight;
|
//public Action RightToLeftAction;
|
//public Action LeftToRightAction;
|
//bool isActioned;
|
//bool action(MotionEvent e)
|
//{
|
// switch (e.Action)
|
// {
|
// case MotionEventActions.Down:
|
// //记录点击的最新X坐标
|
// mLastX = e.RawX;
|
// mLastY = e.RawY;
|
// Parent?.RequestDisallowInterceptTouchEvent(true);
|
// break;
|
// case MotionEventActions.Move:
|
// var x = e.RawX;
|
// var y = e.RawY;
|
// var deltaX = x - mLastX;
|
// var deltaY = y - mLastY;
|
|
// if (Math.Abs(deltaY) < Math.Abs(deltaX))
|
// {
|
// if (!isActioned)
|
// {
|
// //RightToLeftAction
|
// if (deltaX < -mTouchSlop)
|
// {
|
|
// if (x / this.Width >= 0.5)
|
// {
|
|
// isActioned = true;
|
// //parentDelay(true);
|
// Shared.HDLUtils.WriteLine("DrawerLayout:DispatchTouchEvent:RightToLeft");
|
// RightToLeftAction?.Invoke();
|
// }
|
// }
|
// //LeftToRightAction
|
// if (mTouchSlop < deltaX)
|
// {
|
// if (x / this.Width <= 0.5)
|
// {
|
// isActioned = true;
|
// //parentDelay(true);
|
// Shared.HDLUtils.WriteLine("DrawerLayout:DispatchTouchEvent:LeftToRight");
|
// LeftToRightAction?.Invoke();
|
// }
|
// }
|
// }
|
// return true;
|
// }
|
// else
|
// {
|
// //上下滑动时,允许父控件的拦截
|
// if (4 < Math.Abs(deltaY))
|
// {
|
// Parent?.RequestDisallowInterceptTouchEvent(false);
|
// }
|
// }
|
// break;
|
// }
|
// return false;
|
//}
|
|
///// <summary>
|
///// 执行OnInterceptTouchEvent和OnTouchEvent
|
///// </summary>
|
///// <returns><c>true</c>事件已经处理<c>false</c>事件没有处理</returns>
|
///// <param name="e">E.</param>
|
//public override bool DispatchTouchEvent(MotionEvent e)
|
//{
|
// //Shared.HDLUtils.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
|
// if (e.Action == MotionEventActions.Down)
|
// {
|
// isActioned = false;
|
// //还原允许拦截事件
|
// RequestDisallowInterceptTouchEvent(false);
|
// }
|
// return base.DispatchTouchEvent(e);
|
//}
|
|
//public override bool OnInterceptTouchEvent(MotionEvent e)
|
//{
|
// //Shared.HDLUtils.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}");
|
// if (disallowIntercept)
|
// {
|
// return false;
|
// }
|
// if (action(e))
|
// {
|
// return true;
|
// }
|
// return base.OnInterceptTouchEvent(e);
|
//}
|
|
///// <summary>
|
///// 重写点击事件
|
///// </summary>
|
///// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
|
///// <param name="e">E.</param>
|
//public override bool OnTouchEvent(MotionEvent e)
|
//{
|
// //Shared.HDLUtils.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnTouchEvent->{e.Action}");
|
// if (!isActioned)
|
// {
|
// _view.TouchEvent(e);
|
// }
|
// action(e);
|
// return true;
|
//}
|
//bool disallowIntercept;
|
//public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
|
//{
|
// this.disallowIntercept = disallowIntercept;
|
// //Shared.HDLUtils.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
|
// base.RequestDisallowInterceptTouchEvent(disallowIntercept);
|
// Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
|
//}
|
}
|
}
|
}
|