using System;
using Android.Widget;
using Android.Content;
using Android.Views;
using Android.Util;
using Android.Runtime;
namespace Shared
{
//滑动冲突问题后面还得完善
/// <summary>
/// 位置布局
/// </summary>
public class VerticalScrolViewLayout : ViewGroup
{
/// <summary>
/// 构造函数
/// </summary>
public VerticalScrolViewLayout()
{
viewGroup = new AndroidScrolView(Application.Activity, null);
realViewGroup = new AndroidLinearLayout(Application.Activity, this);
(realViewGroup as AndroidLinearLayout).Orientation = Orientation.Vertical;
viewGroup.AddView(realViewGroup);
}
/// <summary>
/// 视图宽度
/// </summary>
/// <value>The width.</value>
public override int Width
{
get
{
return base.Width;
}
set
{
base.Width = value;
if (!IsCanRefresh)
{
return;
}
var layoutParameters = realViewGroup.LayoutParameters;
layoutParameters.Width = Width;
realViewGroup.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 = realViewGroup.LayoutParameters;
layoutParameters.Height = Height;
realViewGroup.LayoutParameters = layoutParameters;
}
}
/// <summary>
/// 是否允许滑动
/// </summary>
/// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
public bool ScrollEnabled
{
get
{
return (viewGroup as AndroidScrolView).ScrollEnable;
}
set
{
(viewGroup as AndroidScrolView).ScrollEnable = value;
}
}
/// <summary>
/// 是否正在滑动
/// </summary>
/// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value>
public bool Decelerating
{
get
{
return false;
}
}
|
|
/// <summary>
/// 是否显示滚动条
/// </summary>
|
//bool _IsShowScrollBar;
|
public bool VerticalScrollBarEnabled
|
{
|
get
{
return (viewGroup as AndroidScrolView).VerticalScrollBarEnabled;
}
|
set
|
{
|
(viewGroup as AndroidScrolView).VerticalScrollBarEnabled = value;
|
|
}
|
}
|
}
|
|
/// <summary>
/// 竖直方向滑动控件
/// </summary>
class AndroidScrolView : Android.Widget.ScrollView
{
/// <summary>
/// 是否允许滑动
/// </summary>
public bool ScrollEnable = true;
View _view;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="context">Context.</param>
/// <param name="view">View.</param>
public AndroidScrolView(Context context, View view)
: base(context)
{
_view = view;
VerticalScrollBarEnabled = true;
}
public override bool DispatchTouchEvent(MotionEvent e)
|
{
|
//Shared.HDLUtils.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
|
if (e.Action == MotionEventActions.Down)
|
{
//还原允许拦截事件
|
RequestDisallowInterceptTouchEvent(false);
}
|
return base.DispatchTouchEvent(e);
|
}
|
|
float mLastX, mLastY ;
public override bool OnInterceptTouchEvent(MotionEvent ev)
{
//Shared.HDLUtils.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{ev.Action}");
|
|
if (!ScrollEnable || disallowIntercept)
{
return false;
}
|
|
switch (ev.Action)
|
{
case MotionEventActions.Down:
mLastX = ev.RawX;
mLastY = ev.RawY;
Parent?.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Move:
var x = ev.RawX;
var y = ev.RawY;
var deltaX = x - mLastX;
var deltaY = y - mLastY;
if (Math.Abs(deltaX) < Math.Abs(deltaY))
|
{
|
//向下滑动,如果当前已经滑动到顶,就允许父控件的拦截事件
|
if (deltaY > 0 && ScrollY == 0)
|
{
|
Parent?.RequestDisallowInterceptTouchEvent(false);
|
return false;
|
}
|
//向上滑动时,如果translateY等于高度时,即表明滑动到底部,可又顶层View控制滑动
|
var mChildH = 0;
|
if (0 < ChildCount)
|
{
|
mChildH = GetChildAt(ChildCount - 1).Bottom;
|
}
|
var translateY = mChildH - ScrollY;
|
if (deltaY < 0 && translateY == Height)
|
{
|
Parent?.RequestDisallowInterceptTouchEvent(false);
|
return false;
|
}
|
}
|
else
|
{
//左右滑动时,允许父控件的拦截
|
if (4 < Math.Abs(deltaX))
|
{
|
Parent?.RequestDisallowInterceptTouchEvent(false);
|
}
}
break;
}
return base.OnInterceptTouchEvent(ev);
}
/// <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} OnInterceptTouchEvent->{e.Action}");
_view?.TouchEvent(e);
base.OnTouchEvent(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);
}
}
}
|