| | |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// 在滑动事件下,可显示隐藏些自定义视图 |
| | | /// </summary> |
| | | public class RowLayout : ViewGroup |
| | | { |
| | | /// <summary> |
| | | /// 右边的视图列表 |
| | | /// </summary> |
| | | internal System.Collections.Generic.List<Button> leftView = new System.Collections.Generic.List<Button>(); |
| | | /// <summary> |
| | | /// 右边的视图列表 |
| | | /// </summary> |
| | | internal System.Collections.Generic.List<Button> rigthView = new System.Collections.Generic.List<Button>(); |
| | | /// <summary> |
| | | /// 在滑动事件下,可显示隐藏些自定义视图 |
| | | /// </summary> |
| | | public class RowLayout : ViewGroup |
| | | { |
| | | ///// <summary> |
| | | ///// OpenLeftMenuAction |
| | | ///// </summary> |
| | | //public Action OpenLeftMenuAction; |
| | | ///// <summary> |
| | | ///// OpenRightMenuAction |
| | | ///// </summary> |
| | | //public Action OpenRightMenuAction; |
| | | |
| | | /// <summary> |
| | | /// 重新刷新控件 |
| | | /// </summary> |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | } |
| | | /// <summary> |
| | | /// 控件宽度 |
| | | /// </summary> |
| | | public override int Width |
| | | { |
| | | get |
| | | { |
| | | return base.Width; |
| | | } |
| | | /// <summary> |
| | | /// OpenMenuAction |
| | | /// </summary> |
| | | public Action OpenMenuAction; |
| | | |
| | | |
| | | /// <summary> |
| | | /// 右边的视图列表 |
| | | /// </summary> |
| | | internal System.Collections.Generic.List<Button> leftView = new System.Collections.Generic.List<Button>(); |
| | | /// <summary> |
| | | /// 右边的视图列表 |
| | | /// </summary> |
| | | internal System.Collections.Generic.List<Button> rigthView = new System.Collections.Generic.List<Button>(); |
| | | /// <summary> |
| | | /// 下面那边张 |
| | | /// </summary> |
| | | UIView lineUIView = new UIView(); |
| | | |
| | | /// <summary> |
| | | /// 重新刷新控件 |
| | | /// </summary> |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | LineColor = lineColor; |
| | | } |
| | | /// <summary> |
| | | /// 控件宽度 |
| | | /// </summary> |
| | | public override int Width |
| | | { |
| | | get |
| | | { |
| | | return base.Width; |
| | | } |
| | | set |
| | | { |
| | | base.Width = value; |
| | | if (!IsCanRefresh) |
| | | return; |
| | | |
| | | var frame4 = lineUIView.Frame; |
| | | frame4.Width = base.Width; |
| | | lineUIView.Frame = frame4; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 子视图的宽度 |
| | | /// </summary> |
| | | public int SubViewWidth = 70; |
| | | /// <summary> |
| | | /// 子视图的宽度 |
| | | /// </summary> |
| | | public int SubViewWidth = 70; |
| | | |
| | | /// <summary> |
| | | /// 控件的高度 |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) |
| | | return; |
| | | /// <summary> |
| | | /// 控件的高度 |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) |
| | | return; |
| | | |
| | | { |
| | | var frame = realViewGroup.Frame; |
| | | frame.Height = Height; |
| | | realViewGroup.Frame = frame; |
| | | } |
| | | } |
| | | } |
| | | { |
| | | var frame = realViewGroup.Frame; |
| | | frame.Height = Height; |
| | | realViewGroup.Frame = frame; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 增加左边视图 |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddLeftView(Button view) |
| | | { |
| | | if (null == view) |
| | | { |
| | | return; |
| | | } |
| | | view.X = leftView.Count * SubViewWidth; |
| | | view.Y = 0; |
| | | view.Width = SubViewWidth; |
| | | view.Height = Height; |
| | | viewGroup.AddSubview(view.RealView); |
| | | view.Parent = this; |
| | | view.Refresh(); |
| | | leftView.Add(view); |
| | | var frame = realViewGroup.Frame; |
| | | frame.X += SubViewWidth; |
| | | realViewGroup.Frame = frame; |
| | | foreach (var right in rigthView) |
| | | { |
| | | right.X += SubViewWidth; |
| | | } |
| | | (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize((leftView.Count + rigthView.Count) * SubViewWidth + realViewGroup.Frame.Width, 0); |
| | | (viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false); |
| | | } |
| | | var frame4 = lineUIView.Frame; |
| | | frame4.Y = base.Height - frame4.Height; |
| | | lineUIView.Frame = frame4; |
| | | } |
| | | } |
| | | |
| | | uint lineColor = 0x80818181; |
| | | /// <summary> |
| | | /// 背景颜色 |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public virtual uint LineColor |
| | | { |
| | | get |
| | | { |
| | | return lineColor; |
| | | } |
| | | set |
| | | { |
| | | lineColor = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | byte r, g, b, a; |
| | | r = (byte)(lineColor / 256 / 256 % 256); |
| | | g = (byte)(lineColor / 256 % 256); |
| | | b = (byte)(lineColor % 256); |
| | | a = (byte)(lineColor / 256 / 256 / 256 % 256); |
| | | lineUIView.BackgroundColor = UIKit.UIColor.FromRGBA(r, g, b, a); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 是否正打开 |
| | | /// </summary> |
| | | //public bool IsOpening; |
| | | public bool IsShowLeft; |
| | | public bool IsShowRight; |
| | | |
| | | /// <summary> |
| | | /// 关闭其他RowLayout 显示的View |
| | | /// </summary> |
| | | private void HideOtherRowLayout() |
| | | { |
| | | try |
| | | { |
| | | if (this.Parent != null) |
| | | { |
| | | foreach (View mView in Parent.viewList) |
| | | { |
| | | if (mView is RowLayout && mView != this) |
| | | { |
| | | |
| | | if ((mView as RowLayout).IsShowRight || (mView as RowLayout).IsShowLeft) |
| | | { |
| | | (mView as RowLayout).HideMenu(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | catch |
| | | { |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 关闭显示的View |
| | | /// </summary> |
| | | public void HideMenu() |
| | | { |
| | | if (IsShowLeft) |
| | | { |
| | | HideLeftMenu(); |
| | | } |
| | | if (IsShowRight) |
| | | { |
| | | HideRightMenu(); |
| | | } |
| | | |
| | | } |
| | | |
| | | public void OpenLeftMenu() |
| | | { |
| | | HideOtherRowLayout(); |
| | | if (IsShowRight) |
| | | { |
| | | HideRightMenu(); |
| | | return; |
| | | } |
| | | |
| | | if (leftView.Count == 0) |
| | | return; |
| | | |
| | | |
| | | IsShowLeft = true; |
| | | (viewGroup as UIScrollView).SetContentOffset(new CGPoint(leftView[0].RealView.Frame.X, 0), false); |
| | | OpenMenuAction?.Invoke(); |
| | | } |
| | | |
| | | public void HideLeftMenu() |
| | | { |
| | | IsShowLeft = false; |
| | | HideAllMenuView(); |
| | | } |
| | | |
| | | public void OpenRightMenu() |
| | | { |
| | | HideOtherRowLayout(); |
| | | if (IsShowLeft) |
| | | { |
| | | HideLeftMenu(); |
| | | return; |
| | | } |
| | | if (rigthView.Count == 0) |
| | | return; |
| | | IsShowRight = true; |
| | | var rigthViewX = realViewGroup.Frame.X + GetAllRightViewWidth(); |
| | | (viewGroup as UIScrollView).SetContentOffset(new CGPoint(rigthViewX, 0), false); |
| | | OpenMenuAction?.Invoke(); |
| | | |
| | | } |
| | | |
| | | public void HideRightMenu() |
| | | { |
| | | IsShowRight = false; |
| | | |
| | | HideAllMenuView(); |
| | | } |
| | | |
| | | void RestMenuView() |
| | | { |
| | | if (IsShowRight) |
| | | { |
| | | OpenRightMenu(); |
| | | } |
| | | else if (IsShowLeft) |
| | | { |
| | | OpenLeftMenu(); |
| | | |
| | | } |
| | | else |
| | | { |
| | | HideAllMenuView(); |
| | | } |
| | | |
| | | } |
| | | |
| | | void HideAllMenuView() |
| | | { |
| | | (viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), true); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 是否使用同样的SubViewWidth宽 |
| | | /// </summary> |
| | | bool isUseSameSubViewWidth = true; |
| | | public bool IsUseSameSubViewWidth |
| | | { |
| | | get |
| | | { |
| | | return isUseSameSubViewWidth; |
| | | |
| | | } |
| | | set |
| | | { |
| | | isUseSameSubViewWidth = value; |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取当前leftView的总宽 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | int GetAllLeftViewWidth() |
| | | { |
| | | int mWidth = 0; |
| | | foreach (var mView in leftView) |
| | | { |
| | | mWidth += mView.Width; |
| | | } |
| | | return mWidth; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取当前rigthView的总宽 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | int GetAllRightViewWidth() |
| | | { |
| | | int mWidth = 0; |
| | | foreach (var mView in rigthView) |
| | | { |
| | | mWidth += mView.Width; |
| | | } |
| | | return mWidth; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 增加左边视图 |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddLeftView(Button view) |
| | | { |
| | | if (null == view) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width; |
| | | |
| | | view.X = GetAllLeftViewWidth(); |
| | | view.Y = 0; |
| | | view.Width = mSubViewWidth; |
| | | view.Height = Height; |
| | | viewGroup.AddSubview(view.RealView); |
| | | view.Parent = this; |
| | | view.Refresh(); |
| | | leftView.Add(view); |
| | | var frame = realViewGroup.Frame; |
| | | frame.X += mSubViewWidth; |
| | | realViewGroup.Frame = frame; |
| | | foreach (var right in rigthView) |
| | | { |
| | | right.X += mSubViewWidth; |
| | | } |
| | | |
| | | RefreshContentSize(); |
| | | |
| | | // var menuWidth = GetAllLeftViewWidth() + GetAllRightViewWidth(); |
| | | // (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize(menuWidth + realViewGroup.Frame.Width, 0); |
| | | //(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false); |
| | | } |
| | | |
| | | void RefreshContentSize() |
| | | { |
| | | var menuWidth = GetAllLeftViewWidth() + GetAllRightViewWidth(); |
| | | (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize(menuWidth + realViewGroup.Frame.Width, 0); |
| | | (viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false); |
| | | } |
| | | |
| | | internal override void removeChildParent() |
| | | { |
| | |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddRightView(Button view) |
| | | { |
| | | if (null == view) |
| | | { |
| | | return; |
| | | } |
| | | view.X =(int)realViewGroup.Frame.Right+ rigthView.Count * SubViewWidth; |
| | | view.Y = 0; |
| | | view.Width = SubViewWidth; |
| | | view.Height = Height; |
| | | viewGroup.AddSubview(view.RealView); |
| | | view.Parent = this; |
| | | view.Refresh(); |
| | | rigthView.Add(view); |
| | | { |
| | | if (null == view) |
| | | { |
| | | return; |
| | | } |
| | | var mSubViewWidth = isUseSameSubViewWidth ? SubViewWidth : view.Width; |
| | | |
| | | (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize((leftView.Count + rigthView.Count) * SubViewWidth + realViewGroup.Frame.Width, 0); |
| | | (viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false); |
| | | view.X = (int)realViewGroup.Frame.Right + GetAllRightViewWidth(); |
| | | view.Y = 0; |
| | | view.Width = mSubViewWidth; |
| | | view.Height = Height; |
| | | viewGroup.AddSubview(view.RealView); |
| | | view.Parent = this; |
| | | view.Refresh(); |
| | | rigthView.Add(view); |
| | | |
| | | } |
| | | RefreshContentSize(); |
| | | |
| | | // (viewGroup as UIScrollView).ContentSize = new CoreGraphics.CGSize((leftView.Count + rigthView.Count) * SubViewWidth + realViewGroup.Frame.Width, 0); |
| | | //(viewGroup as UIScrollView).SetContentOffset(new CGPoint(realViewGroup.Frame.X, 0), false); |
| | | |
| | | } |
| | | |
| | | nfloat beforeXScrollX; |
| | | nfloat moveX; |
| | | /// <summary> |
| | | /// 在滑动事件下,可显示隐藏些自定义视图 |
| | | /// </summary> |
| | | public RowLayout() |
| | | { |
| | | { |
| | | viewGroup = new UIScrollView { Bounces = false }; |
| | | realViewGroup = new MyRowLayout(this) { }; |
| | | |
| | | viewGroup.AddSubview(realViewGroup); |
| | | viewGroup.Layer.MasksToBounds = true; |
| | | |
| | | viewGroup.AddSubview(realViewGroup); |
| | | viewGroup.Layer.MasksToBounds = true; |
| | | |
| | | lineUIView.BackgroundColor = new UIColor(0x81 / 255.0f, 0x81 / 255.0f, 0x81 / 255.0f, 0.8f); |
| | | var lineUIViewFrame = lineUIView.Frame; |
| | | lineUIViewFrame.Height = 1.0f; |
| | | lineUIView.Frame = lineUIViewFrame; |
| | | viewGroup.AddSubview(lineUIView); |
| | | |
| | | (viewGroup as UIScrollView).ShowsHorizontalScrollIndicator = false;//隐藏水平滚动条 |
| | | |
| | | |
| | | (viewGroup as UIScrollView).Scrolled += (s, e) => |
| | | { |
| | | moveX = (viewGroup as UIScrollView).ContentOffset.X - beforeXScrollX; |
| | | }; |
| | | |
| | | (viewGroup as UIScrollView).DraggingStarted += (sender, e) => |
| | | { |
| | | beforeXScrollX = (viewGroup as UIScrollView).ContentOffset.X; |
| | | }; |
| | | |
| | | (viewGroup as UIScrollView).DecelerationStarted += (s, e) => |
| | | { |
| | | |
| | | GetMovePageIndex(); |
| | | |
| | | }; |
| | | |
| | | |
| | | |
| | | (viewGroup as UIScrollView).DraggingEnded += (s, e) => |
| | | { |
| | | if (!e.Decelerate) |
| | | { |
| | | GetMovePageIndex(); |
| | | } |
| | | }; |
| | | |
| | | } |
| | | |
| | | void GetMovePageIndex() |
| | | { |
| | | |
| | | if (20 < Math.Abs(moveX)) |
| | | { |
| | | if (moveX < 0) |
| | | { |
| | | OpenLeftMenu(); |
| | | } |
| | | else if (moveX > 0) |
| | | { |
| | | OpenRightMenu(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | RestMenuView(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |