wxr
2020-06-15 b8e94316e41eba72d927d5ca7d931b26139ee8ff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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);
        }
    }
}