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