using System;
|
using Android.Content;
|
using Android.Views;
|
using Android.Views.Animations;
|
|
namespace Shared
|
{
|
public class SwipeLayout:ViewGroup
|
{
|
AndroidSwipeLayout androidSwipeLayout;
|
|
uint lineColor = 0x62818181;
|
/// <summary>
|
/// 背景颜色
|
/// </summary>
|
/// <value>The color of the background.</value>
|
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));
|
}
|
}
|
|
/// <summary>
|
/// 宽度设置或读取
|
/// </summary>
|
/// <value>The width.</value>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 视图高度
|
/// </summary>
|
/// <value>The height.</value>
|
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;
|
/// <summary>
|
/// 在滑动事件下,可显示隐藏些自定义视图
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 子视图的宽度
|
/// </summary>
|
int subViewWidth = 100;
|
|
/// <summary>
|
/// 增加左边视图
|
/// </summary>
|
/// <param name="view">View.</param>
|
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;
|
}
|
|
/// <summary>
|
/// 增加右边视图
|
/// </summary>
|
/// <param name="view">View.</param>
|
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
|
{
|
/// <summary>
|
/// 左右滑动的最短距离
|
/// </summary>
|
int distance = 100;
|
/// <summary>
|
/// 左右滑动的最小速度
|
/// </summary>
|
int velocity = 200;
|
|
bool isFling;
|
/// <summary>
|
/// 手势对象
|
/// </summary>
|
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);
|
}
|
|
/// <summary>
|
/// 设置所有父视图禁止拦截事件
|
/// </summary>
|
/// <param name="b">如果设置True表示不要拦截,如果设置为False表示可以拦截</param>
|
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;
|
}
|
}
|
}
|
}
|