From e29de9af8f507d288a61d9459fb3d1f72976876f Mon Sep 17 00:00:00 2001
From: 陈嘉乐 <cjl@hdlchina.com.cn>
Date: 星期一, 18 五月 2020 10:40:08 +0800
Subject: [PATCH] 2020-05-18-1
---
Shared.IOS/UI/HorizontalPages.cs | 293 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 263 insertions(+), 30 deletions(-)
diff --git a/Shared.IOS/UI/HorizontalPages.cs b/Shared.IOS/UI/HorizontalPages.cs
index fcee4f2..f891f2a 100644
--- a/Shared.IOS/UI/HorizontalPages.cs
+++ b/Shared.IOS/UI/HorizontalPages.cs
@@ -3,6 +3,7 @@
using Shared.IO;
using CoreGraphics;
using Foundation;
+using CoreAnimation;
namespace Shared
{
@@ -15,6 +16,7 @@
//readonly UIPageControl iosUIPageControl;
+
/// <summary>
/// 椤甸潰鍙樺寲浜嬩欢
/// </summary>
@@ -25,6 +27,9 @@
/// </summary>
class MyHorizontalPages : UIScrollView
{
+ nfloat beforeXScrollX;
+ nfloat moveX;
+
[Weak] HorizontalPages HorizontalPages;
//nfloat mLastX, mLastY, deltaX;
public MyHorizontalPages(HorizontalPages HorizontalPages)
@@ -32,29 +37,68 @@
this.HorizontalPages = HorizontalPages;
//this.ScrollEnabled = false;
+ Scrolled += (s, e) =>
+ {
+ moveX = this.ContentOffset.X - beforeXScrollX;
+ };
+
+ DraggingStarted += (sender, e) =>
+ {
+ beforeXScrollX = this.ContentOffset.X;
+ };
DecelerationStarted += (s, e) =>
{
- var tempUIScrolView = s as MyHorizontalPages;
- //鑾峰彇褰撳墠鐣岄潰鐨勭储寮�
- //System.Console.WriteLine($"DecelerationStarted-------{tempUIScrolView.ContentOffset.X}");
- var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (tempUIScrolView.Frame.Width - 2 * this.HorizontalPages._RowPadding + this.HorizontalPages._PagePadding));
- this.HorizontalPages.PageIndex = tempPageIndex;
+ //var tempUIScrolView = s as MyHorizontalPages;
+ ////鑾峰彇褰撳墠鐣岄潰鐨勭储寮�
+ ////System.Console.WriteLine($"DecelerationStarted-------{tempUIScrolView.ContentOffset.X}");
+ //var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (this.HorizontalPages.mScrollWidth));
+ //this.HorizontalPages.PageIndex = tempPageIndex;
+ GetMovePageIndex();
+
};
- DraggingEnded += (s, e) =>
- {
+ //DecelerationEnded += (s, e) =>
+ //{
+ // Console.WriteLine("HorizontalPages DecelerationEnded");
+ //};
+
+ DraggingEnded += (s, e) =>
+ {
+
var tempUIScrolView = s as MyHorizontalPages;
if (!e.Decelerate)
{
-
- //System.Console.WriteLine($"DraggingEnded-------{tempUIScrolView.ContentOffset.X}");
- var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (tempUIScrolView.Frame.Width - 2 * this.HorizontalPages._RowPadding + this.HorizontalPages._PagePadding));
- this.HorizontalPages.PageIndex = tempPageIndex;
+ GetMovePageIndex();
+ ////System.Console.WriteLine($"DraggingEnded-------{tempUIScrolView.ContentOffset.X}");
+ //var tempPageIndex = Convert.ToInt32(tempUIScrolView.ContentOffset.X / (this.HorizontalPages.mScrollWidth));
+ //this.HorizontalPages.PageIndex = tempPageIndex;
}
};
}
+
+ private void GetMovePageIndex() {
+
+ if (mTouchSlop < Math.Abs(moveX))
+ {
+ if (moveX < 0)
+ {
+ this.HorizontalPages.PageIndex -= 1;
+ }
+ else if (moveX > 0)
+ {
+ this.HorizontalPages.PageIndex += 1;
+ }
+ }
+ else
+ {
+ this.HorizontalPages.PageIndex = this.HorizontalPages.PageIndex;
+ }
+
+ }
+
+
/// <summary>
/// 鐐瑰嚮寮�濮�
/// </summary>
@@ -153,12 +197,52 @@
viewGroup.AddSubview(iosUIScrolView);
_PagePadding = Application.GetRealWidth(50);
_RowPadding = Application.GetRealWidth(100);
+ _TCBJ = Application.GetRealWidth(50);
}
- //涓や釜Page涔嬮棿鐨勮窛绂�
+
+
+ // //涓や釜Page涔嬮棿鐨勮窛绂�
+ //int _PagePadding;
+ //public int PagePadding
+ //{
+ // get
+ // {
+ // return _PagePadding;
+ // }
+ // set
+ // {
+ // _PagePadding = value;
+ // ReLocation();
+ // }
+ //}
+ ////page鐨勫杈硅窛
+ //int _RowPadding;
+ //public int RowPadding
+ //{
+ // get
+ // {
+ // return _RowPadding;
+ // }
+ // set
+ // {
+ // _RowPadding = value;
+ // ReLocation();
+ // }
+ //}
+ /// <summary>
+ /// 绐佸嚭瀹藉害
+ /// </summary>
+ //public int JMBJ
+
+
+ //涓や釜Page鐣岄潰涔嬮棿鐨勮窛绂�
int _PagePadding;
- public int PagePadding
+ /// <summary>
+ /// 鐣岄潰涔嬮棿鐨勮竟璺�
+ /// </summary>
+ public int JMBJ
{
get
{
@@ -167,28 +251,148 @@
set
{
_PagePadding = value;
+ _RowPadding = _TCBJ + _PagePadding;
+ RefreshScrollWidth();
ReLocation();
}
}
- //page鐨勫杈硅窛
+
+ //page鐨勪笌鎵嬫満灞忓箷鐨勮竟璺� = 绐佸嚭瀹藉害 + 涓や釜Page涔嬮棿鐨勮窛绂�
int _RowPadding;
- public int RowPadding
+ /// <summary>
+ /// 绐佸嚭瀹藉害
+ /// </summary>
+ int _TCBJ;
+ public int TCBJ
{
get
{
- return _RowPadding;
+ return _TCBJ;
}
set
{
- _RowPadding = value;
+ _TCBJ = value;
+ _RowPadding = _TCBJ + _PagePadding;
+ RefreshScrollWidth();
ReLocation();
}
}
-
+ int mScrollWidth;
+ int mPageWidth;
+ private void RefreshScrollWidth()
+ {
+ mScrollWidth = (int)this.RealView.Frame.Width - 2 * _RowPadding + _PagePadding;
+ mPageWidth = (int)this.RealView.Frame.Width - 2 * _RowPadding;
+
+ }
+ private void RefreshPageView() {
+ //RefreshView();
+ RefreshViewWithTransform3D();
+ }
+
+ //********************Transform3D 鏃嬭浆鏁堟灉鏂规硶**********************
+ //榛樿25搴�
+ nfloat transformAngle = (nfloat)(25 * Math.PI / 180.0);
+ //鏃嬭浆瑙掑害
+ public int TransformAngle
+ {
+ set
+ {
+ transformAngle = (nfloat)(value * Math.PI / 180.0);
+ }
+ }
+
+ //
+ public void RefreshViewWithTransform3D()
+ {
+ if (iosUIScrolView.Subviews.Length <= 0) return;
+
+ if (PageIndex > iosUIScrolView.Subviews.Length - 1)
+ {
+ PageIndex = iosUIScrolView.Subviews.Length - 1;
+ }
+
+ // - 鍗曚綅鐭╅樀
+ CATransform3D transform = CATransform3D.Identity;
+ // - 澧炲姞閫忚鏁堟灉
+ transform.m34 = (nfloat)(-1.0 / 500);
+ var mRotate = transform.Rotate(0, 0f, 1f, 0f);
+ iosUIScrolView.Subviews[PageIndex].Layer.Transform = mRotate;
+
+
+ //鍒ゆ柇PageIndex 鍓嶅悗鏄惁鏈塿iew锛屽苟鏃嬭浆
+ if (PageIndex - 1 >= 0)
+ {
+ var mRotate1 = transform.Rotate(transformAngle, 0f, 1f, 0f);
+ iosUIScrolView.Subviews[PageIndex - 1].Layer.Transform = mRotate1;
+ }
+
+ if (PageIndex <= iosUIScrolView.Subviews.Length - 2)
+ {
+ var mRotate2 = transform.Rotate(-1 * transformAngle, 0f, 1f, 0f);
+ iosUIScrolView.Subviews[PageIndex + 1].Layer.Transform = mRotate2;
+ }
+
+
+
+
+ }
+
+ int PaddingHeight = 20;
+ //********************鏅�氶珮搴︽敼鍙樻柟娉�**********************
+ private void RefreshView()
+ {
+ if (iosUIScrolView.Subviews.Length <= 0) return;
+
+ if (PageIndex > iosUIScrolView.Subviews.Length - 1)
+ {
+ PageIndex = iosUIScrolView.Subviews.Length - 1;
+ }
+
+ //System.Console.WriteLine($" tempPageIndex:{PageIndex}");
+ if (PageIndex == 0)
+ {
+ var frame0 = iosUIScrolView.Subviews[0].Frame;
+ frame0.Height = iosUIScrolView.Frame.Height;
+ frame0.Y = 0;
+ iosUIScrolView.Subviews[0].Frame = frame0;
+
+ if (iosUIScrolView.Subviews.Length > 1)
+ {
+ var frame1 = iosUIScrolView.Subviews[1].Frame;
+ frame1.Height = iosUIScrolView.Frame.Height - PaddingHeight;
+ frame1.Y = PaddingHeight/2;
+ iosUIScrolView.Subviews[1].Frame = frame1;
+ }
+
+
+
+ }
+ else
+ {
+ var frame0 = iosUIScrolView.Subviews[PageIndex].Frame;
+ frame0.Height = iosUIScrolView.Frame.Height;
+ frame0.Y = 0;
+ iosUIScrolView.Subviews[PageIndex].Frame = frame0;
+
+ var frame = iosUIScrolView.Subviews[PageIndex - 1].Frame;
+ frame.Height = iosUIScrolView.Frame.Height - PaddingHeight;
+ frame.Y = PaddingHeight/2;
+ iosUIScrolView.Subviews[PageIndex - 1].Frame = frame;
+ if (PageIndex <= iosUIScrolView.Subviews.Length - 2)
+ {
+ var frame1 = iosUIScrolView.Subviews[PageIndex + 1].Frame;
+ frame1.Height = iosUIScrolView.Frame.Height - PaddingHeight;
+ frame1.Y = PaddingHeight/2;
+ iosUIScrolView.Subviews[PageIndex + 1].Frame = frame1;
+ }
+ }
+
+ }
/// <summary>
/// 鏄惁鍏佽婊戝姩
@@ -232,7 +436,7 @@
var viewSize = iosUIScrolView.Frame.Size;
-
+ RefreshPageView();
var rect = new CGRect(pageIndex * viewSize.Width, 0, viewSize.Width, viewSize.Height);
if (pageIndex != 0) {
var frame = iosUIScrolView.Subviews[pageIndex].Frame;
@@ -243,19 +447,39 @@
}
//System.Console.WriteLine($"pageIndex xx-------{pageIndex}");
- iosUIScrolView.ScrollRectToVisible(rect, false);
+
+ //Console.WriteLine("HorizontalPages ScrollRectToVisible");
+ iosUIScrolView.ScrollRectToVisible(rect, true);
if (beforePageIndex != pageIndex)
- {
- PageChange?.Invoke(this, pageIndex);
+ {
+ //Console.WriteLine("HorizontalPages DelayPageChange");
+ DelayPageChange();
+ //PageChange?.Invoke(this, pageIndex);
}
}
}
- /// <summary>
- /// 澧炲姞瀛愭帶浠�
- /// </summary>
- /// <param name="view">View.</param>
- public override void AddChidren(View view)
+
+
+
+ public void DelayPageChange()
+ {
+ new System.Threading.Thread(async () =>
+ {
+ System.Threading.Thread.Sleep(500);
+ Application.RunOnMainThread(() =>
+ {
+ PageChange?.Invoke(this, pageIndex);
+ });
+ })
+ { IsBackground = true }.Start();
+ }
+
+ /// <summary>
+ /// 澧炲姞瀛愭帶浠�
+ /// </summary>
+ /// <param name="view">View.</param>
+ public override void AddChidren(View view)
{
//var v = Application.AverageScale;
//var vv = Application.CurrentHeight;
@@ -276,6 +500,9 @@
var frame0 = iosUIScrolView.Subviews[0].Frame;
frame0.X = _RowPadding;
+ frame0.Y = 0;
+ frame0.Width = mPageWidth;
+ frame0.Height = iosUIScrolView.Frame.Height;
iosUIScrolView.Subviews[0].Frame = frame0;
@@ -283,12 +510,18 @@
for (int i = 1; i < iosUIScrolView.Subviews.Length; i++)
{
var frame = iosUIScrolView.Subviews[i].Frame;
- frame.X = iosUIScrolView.Subviews[i - 1].Frame.Right+_PagePadding;
- iosUIScrolView.Subviews[i].Frame = frame;
+
+ frame.Width = mPageWidth;
+ frame.Height = iosUIScrolView.Frame.Height;
+ frame.Y = 0;
+ //frame.X = iosUIScrolView.Subviews[i - 1].Frame.Right + _PagePadding;
+ frame.X = _RowPadding + (mPageWidth + _PagePadding)*i;
+ iosUIScrolView.Subviews[i].Frame = frame;
}
iosUIScrolView.ContentSize = new CoreGraphics.CGSize(iosUIScrolView.Subviews[iosUIScrolView.Subviews.Length - 1].Frame.Right+_RowPadding, iosUIScrolView.Frame.Height);
- }
+ RefreshPageView();
+ }
--
Gitblit v1.8.0