using System; using Android.Content; using Android.Views; using Android.Views.Animations; namespace Shared { public class SwipeLayout:ViewGroup { AndroidSwipeLayout androidSwipeLayout; uint lineColor = 0x62818181; /// /// 背景颜色 /// /// The color of the background. public virtual uint LineColor { get { return lineColor; } set { lineColor = value; byte a, r, g, b; a = (byte)(lineColor / 256 / 256 / 256 % 256); r = (byte)(lineColor / 256 / 256 % 256); g = (byte)(lineColor / 256 % 256); b = (byte)(lineColor % 256); lineLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); } } /// /// 宽度设置或读取 /// /// The width. public override int Width { get { return base.Width; } set { base.Width = value; if (!IsCanRefresh) { return; } var layoutParameters = androidSwipeLayout.LayoutParameters; layoutParameters.Width = Width; androidSwipeLayout.LayoutParameters = layoutParameters; } } /// /// 视图高度 /// /// The height. public override int Height { get { return base.Height; } set { base.Height = value; if (!IsCanRefresh) { return; } var layoutParameters = androidSwipeLayout.LayoutParameters; layoutParameters.Height = Height; androidSwipeLayout.LayoutParameters = layoutParameters; } } Android.Widget.LinearLayout leftLinarLayout; Android.Widget.LinearLayout rightLinarLayout; Android.Widget.LinearLayout lineLinearLayout; /// /// 在滑动事件下,可显示隐藏些自定义视图 /// public SwipeLayout() { viewGroup = new Android.Widget.FrameLayout(Application.Activity); androidSwipeLayout = new AndroidSwipeLayout(Application.Activity, this); realViewGroup = androidSwipeLayout; leftLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f }; rightLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f }; lineLinearLayout = new Android.Widget.LinearLayout(Application.Activity); LineColor = lineColor; viewGroup.AddView(leftLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); viewGroup.AddView(rightLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); viewGroup.AddView(androidSwipeLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent)); viewGroup.AddView(lineLinearLayout, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1), Android.Views.GravityFlags.Bottom)); } void openLeftMenu() { hideRightMenu(); if (leftLinarLayout.ChildCount == 0) return; Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; lp.LeftMargin = leftLinarLayout.LayoutParameters.Width; androidSwipeLayout.LayoutParameters = lp; leftLinarLayout.Alpha = 1.0f; leftLinarLayout.ClearAnimation(); leftLinarLayout.Animation = new TranslateAnimation( Dimension.RelativeToSelf, 0.1f, Dimension.RelativeToSelf, 0, Dimension.RelativeToSelf, 0, Dimension.RelativeToSelf, 0); leftLinarLayout.Animation.Duration = 200; leftLinarLayout.Animation.StartNow(); } void hideLeftMenu() { Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; lp.LeftMargin = 0; androidSwipeLayout.LayoutParameters = lp; leftLinarLayout.Alpha = 0.0f; } void openRightMenu() { hideLeftMenu(); if (rightLinarLayout.ChildCount == 0) return; Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; lp.LeftMargin = -rightLinarLayout.LayoutParameters.Width; androidSwipeLayout.LayoutParameters = lp; rightLinarLayout.Alpha = 1.0f; if (rightLinarLayout.Animation == null) { rightLinarLayout.Animation = new TranslateAnimation( Dimension.RelativeToSelf, -0.1f, Dimension.RelativeToSelf, 0.0f, Dimension.RelativeToSelf, 0, Dimension.RelativeToSelf, 0); rightLinarLayout.Animation.Duration = 200; } rightLinarLayout.Animation.Reset(); rightLinarLayout.Animation.StartNow(); } void hideRightMenu() { Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; lp.LeftMargin = 0; androidSwipeLayout.LayoutParameters = lp; rightLinarLayout.Alpha = 0.0f; } /// /// 子视图的宽度 /// int subViewWidth = 100; /// /// 增加左边视图 /// /// View. public void AddLeftView(View view) { leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidSwipeLayout.LayoutParameters.Height)); leftLinarLayout.LayoutParameters.Width = leftLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth); view.Parent = this; view.Width = DensityUtil.Dip2Px(subViewWidth); view.Height = androidSwipeLayout.LayoutParameters.Height; } /// /// 增加右边视图 /// /// View. public void AddRightView(View view) { rightLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidSwipeLayout.LayoutParameters.Height)); rightLinarLayout.LayoutParameters.Width = rightLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth); ((Android.Widget.FrameLayout.LayoutParams)rightLinarLayout.LayoutParameters).LeftMargin = androidSwipeLayout.LayoutParameters.Width - rightLinarLayout.LayoutParameters.Width; view.Parent = this; view.Width = DensityUtil.Dip2Px(subViewWidth); view.Height = androidSwipeLayout.LayoutParameters.Height; } internal class AndroidSwipeLayout : Android.Widget.FrameLayout, GestureDetector.IOnGestureListener { /// /// 左右滑动的最短距离 /// int distance = 100; /// /// 左右滑动的最小速度 /// int velocity = 200; bool isFling; /// /// 手势对象 /// GestureDetector mGesture; SwipeLayout swipeLayout; public AndroidSwipeLayout(Context context, SwipeLayout swipeLayout) : base(context) { this.swipeLayout = swipeLayout; mGesture = new GestureDetector(context, this); } public override bool OnTouchEvent(MotionEvent e) { if (Shared.AndroidView.IsLive(this) && !isFling) swipeLayout.TouchEvent(e); return true; } public override bool OnInterceptTouchEvent(MotionEvent ev) { if (!Shared.AndroidView.IsLive(this)) { return false; } mGesture.OnTouchEvent(ev); //如果是滑动,就拦截事件,后面的事件是由自己的TouchEvent处理,子控件会收到取消事件,如果是快速滑动,事件也是自己处理 if (isFling) { return true; } //如果是滑动这里也会返回True return base.OnInterceptTouchEvent(ev); } /// /// 设置所有父视图禁止拦截事件 /// /// 如果设置True表示不要拦截,如果设置为False表示可以拦截 void requestParentDisallowInterceptTouchEvent(bool b) { var tempParent = Parent; while (tempParent != null) { //告诉父类不要拦截这个视图的事件 tempParent.RequestDisallowInterceptTouchEvent(b); tempParent = tempParent.Parent; } } public bool OnDown(MotionEvent e) { isFling = false; return false; } public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度(像素/秒) // velocityY:Y轴上的移动速度(像素/秒) // 向左滑 if (e1.GetX() - e2.GetX() > distance && Math.Abs(velocityX) > velocity) { isFling = true; swipeLayout.openRightMenu(); } // 向右滑 if (e2.GetX() - e1.GetX() > distance && Math.Abs(velocityX) > velocity) { isFling = true; swipeLayout.openLeftMenu(); } //迅速滑动,并松开 return false; } public void OnLongPress(MotionEvent e) { Shared.HDLUtils.WriteLine("OnLongPress:长按不放"); } public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Shared.HDLUtils.WriteLine("OnScroll:在屏幕上滑动"); return false; } public void OnShowPress(MotionEvent e) { Shared.HDLUtils.WriteLine("OnShowPress:手指按下一段时间,还没到长按"); } public bool OnSingleTapUp(MotionEvent e) { if(!isFling){ swipeLayout.hideLeftMenu(); swipeLayout.hideRightMenu(); } Shared.HDLUtils.WriteLine("OnSingleTapUp:手指弹起"); return false; } } } }