{
if (mLayout != null)
{
- mLayout.StopScroll(false);
+ mLayout.StopScroll();
}
if (mAdapter != null)
{
offset = range - extent;
}
- if (offset < 0)
- {
- offset = 0;
- }
if (mScrollBar.Direction == ScrollBar.DirectionType.Vertical)
{
mScrollBar.ThumbSize = new Size(thickness, length);
{
if (e.PanGesture.State == Gesture.StateType.Started)
{
- mLayout.StopScroll(true);
+ mLayout.StopScroll();
}
else if (e.PanGesture.State == Gesture.StateType.Continuing)
{
if (mLayout.CanScrollVertically())
{
- mLayout.ScrollVerticallyBy((int)e.PanGesture.Displacement.Y, mRecycler, true);
+ mLayout.ScrollVerticallyBy(e.PanGesture.Displacement.Y, mRecycler, true);
}
else if (mLayout.CanScrollHorizontally())
{
- mLayout.ScrollHorizontallyBy((int)e.PanGesture.Displacement.X, mRecycler, true);
+ mLayout.ScrollHorizontallyBy(e.PanGesture.Displacement.X, mRecycler, true);
}
ShowScrollBar();
{
if (mLayout.CanScrollVertically())
{
- mLayout.ScrollVerticallyBy((int)e.PanGesture.Velocity.Y * 600, mRecycler, false);
+ mLayout.ScrollVerticallyBy(e.PanGesture.Velocity.Y * 600, mRecycler, false);
}
else if (mLayout.CanScrollHorizontally())
{
- mLayout.ScrollHorizontallyBy((int)e.PanGesture.Velocity.X * 600, mRecycler, false);
+ mLayout.ScrollHorizontallyBy(e.PanGesture.Velocity.X * 600, mRecycler, false);
}
ShowScrollBar(1200, true);
}
Down
}
- private readonly int SCROLL_ANIMATION_DURATION = 500;
-
private FlexibleView mFlexibleView;
private ChildHelper mChildHelper;
public void LayoutChild(ViewHolder child, float left, float top, float width, float height)
{
View itemView = child.ItemView;
- itemView.SizeWidth = (int)(width - itemView.Margin.Start - itemView.Margin.End);
- itemView.SizeHeight = (int)(height - itemView.Margin.Top - itemView.Margin.Bottom);
- itemView.PositionX = (int)(left + itemView.Margin.Start);
- itemView.PositionY = (int)(top + itemView.Margin.Top);
+ itemView.SizeWidth = width - itemView.Margin.Start - itemView.Margin.End;
+ itemView.SizeHeight = height - itemView.Margin.Top - itemView.Margin.Bottom;
+ itemView.PositionX = left + itemView.Margin.Start;
+ itemView.PositionY = top + itemView.Margin.Top;
}
/// <summary>
return;
}
- if (dx == 0)
+ if (mScrollAni == null)
{
- return;
+ mScrollAni = new Animation();
+ mScrollAni.Finished += OnScrollAnimationFinished;
+ }
+ else if (mScrollAni.State == Animation.States.Playing)
+ {
+ //StopScroll();
+ mScrollAni.Stop(Animation.EndActions.StopFinal);
}
+ mScrollAni.Duration = 500;
+ mScrollAni.DefaultAlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOutSquare);
+
+ mScrollAni.Clear();
int childCount = mChildHelper.GetChildCount();
if (immediate == true)
for (int i = childCount - 1; i >= 0; i--)
{
ViewHolder v = mChildHelper.GetChildAt(i);
- v.ItemView.PositionX = (int)(v.ItemView.PositionX + dx);
+ v.ItemView.PositionX += dx;
}
}
else
{
- if (mScrollAni == null)
- {
- mScrollAni = new Animation();
- mScrollAni.Duration = SCROLL_ANIMATION_DURATION;
- mScrollAni.DefaultAlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOutSquare);
- }
-
- // avoid out of boundary of flexibleview. delta value might be used for shadow.
- // this must be done before animation clear.
- if (childCount > 0)
- {
- ViewHolder vh = mChildHelper.GetChildAt(0);
- if (vh.LayoutPosition == 0)
- {
- if ((int)(vh.ItemView.PositionX + dx) != 0)
- {
- dx = (int)(0 - vh.ItemView.PositionX);
- }
- }
-
- vh = mChildHelper.GetChildAt(childCount - 1);
- if (vh.LayoutPosition == ItemCount - 1)
- {
- if ((int)(vh.ItemView.PositionX + dx) != (int)Width)
- {
- dx = (int)(Width - vh.ItemView.PositionX);
- }
- }
- }
-
- // save position before animation clear.
- float[] childrenPositon = new float[childCount];
- for (int i = childCount - 1; i >= 0; i--)
- {
- ViewHolder v = mChildHelper.GetChildAt(i);
- childrenPositon[i] = (int)v.ItemView.PositionX;
- }
-
- mScrollAni.Clear();
- mScrollAni.Finished += OnScrollAnimationFinished;
-
for (int i = childCount - 1; i >= 0; i--)
{
ViewHolder v = mChildHelper.GetChildAt(i);
-
- // set position again because position might be changed after animation clear.
- v.ItemView.PositionX = childrenPositon[i];
-
- mScrollAni.AnimateTo(v.ItemView, "PositionX", (int)(v.ItemView.PositionX + dx));
+ mScrollAni.AnimateTo(v.ItemView, "PositionX", v.ItemView.PositionX + dx);
}
mScrollAni.Play();
}
return;
}
- if (dy == 0)
+ if (mScrollAni == null)
{
- return;
+ mScrollAni = new Animation();
+ mScrollAni.Finished += OnScrollAnimationFinished;
+ }
+ else if (mScrollAni.State == Animation.States.Playing)
+ {
+ //StopScroll();
+ mScrollAni.Stop(Animation.EndActions.StopFinal);
}
+ mScrollAni.Duration = 500;
+ mScrollAni.DefaultAlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOutSquare);
+
+ mScrollAni.Clear();
int childCount = mChildHelper.GetChildCount();
if (immediate == true)
for (int i = childCount - 1; i >= 0; i--)
{
ViewHolder v = mChildHelper.GetChildAt(i);
- v.ItemView.PositionY = (int)(v.ItemView.PositionY + dy);
+ v.ItemView.PositionY += dy;
}
}
else
{
- if (mScrollAni == null)
- {
- mScrollAni = new Animation();
- mScrollAni.Duration = SCROLL_ANIMATION_DURATION;
- mScrollAni.DefaultAlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOutSquare);
- }
-
- // avoid out of boundary of flexibleview. delta value might be used for shadow.
- // this must be done before animation clear.
- if (childCount > 0)
- {
- ViewHolder vh = mChildHelper.GetChildAt(0);
- if (vh.LayoutPosition == 0)
- {
- if ((int)(vh.ItemView.PositionY + dy) != 0)
- {
- dy = (int)(0 - vh.ItemView.PositionY);
- }
- }
-
- vh = mChildHelper.GetChildAt(childCount - 1);
- if (vh.LayoutPosition == ItemCount - 1)
- {
- if ((int)(vh.ItemView.PositionY + dy) != (int)Height)
- {
- dy = (int)(Height - vh.ItemView.PositionY);
- }
- }
- }
-
- // save position before animation clear.
- float[] childPositon = new float[childCount];
for (int i = childCount - 1; i >= 0; i--)
{
ViewHolder v = mChildHelper.GetChildAt(i);
- childPositon[i] = (int)v.ItemView.PositionY;
- }
-
- mScrollAni.Clear();
- mScrollAni.Finished += OnScrollAnimationFinished;
-
- for (int i = childCount - 1; i >= 0; i--)
- {
- ViewHolder v = mChildHelper.GetChildAt(i);
-
- // set position again because position might be changed after animation clear.
- v.ItemView.PositionY = childPositon[i];
-
- mScrollAni.AnimateTo(v.ItemView, "PositionY", (int)(v.ItemView.PositionY + dy));
+ mScrollAni.AnimateTo(v.ItemView, "PositionY", v.ItemView.PositionY + dy);
}
mScrollAni.Play();
}
mChildHelper = recyclerView.mChildHelper;
}
- internal void StopScroll(bool doSomethingAfterAnimationStopped)
+ internal void StopScroll()
{
if (mScrollAni != null && mScrollAni.State == Animation.States.Playing)
{
- mScrollAni.Finished -= OnScrollAnimationFinished;
- mScrollAni.Stop();
-
- if (doSomethingAfterAnimationStopped)
- {
- OnScrollAnimationFinished(mScrollAni, null);
- }
+ mScrollAni.Stop(Animation.EndActions.StopFinal);
+ mScrollAni.Clear();
+ OnScrollAnimationFinished(mScrollAni, null);
}
}
private void OnScrollAnimationFinished(object sender, EventArgs e)
{
- foreach (ViewHolder holder in mPendingRecycleViews)
- {
- holder.PendingRecycle = false;
- }
- mPendingRecycleViews.Clear();
-
- int start = NO_POSITION;
- ViewHolder firstItemView = FindFirstVisibleItemView();
- if (firstItemView != null)
- start = firstItemView.LayoutPosition;
- else
- start = 0;
-
- int itemCount = ChildCount;
-
- int end = NO_POSITION;
- ViewHolder lastItemView = FindLastVisibleItemView();
- if (lastItemView != null)
- end = lastItemView.LayoutPosition;
- else
- end = itemCount - 1;
-
- List<ViewHolder> removedViewList = new List<ViewHolder>();
- for (int i = 0; i < itemCount; i++)
- {
- ViewHolder v = GetChildAt(i);
-
- //if item view of holder is visible, it should not be recycled.
- if (v.LayoutPosition >= start && v.LayoutPosition <= end)
- continue;
-
- removedViewList.Add(v);
- }
-
- for (int i = 0; i < removedViewList.Count; i++)
- {
- ViewHolder v = removedViewList[i];
- v.PendingRecycle = false;
- mFlexibleView.mRecycler.RecycleView(v);
- mChildHelper.RemoveView(v);
- }
-
- // relayout
- mFlexibleView.OnRelayout(null, null);
+ RecycleChildrenInt(mFlexibleView.mRecycler);
}
private void AddViewInternal(ViewHolder holder, int index, bool disappearing)
}
}
- /// <summary>
- /// FindFirstVisibleItemView
- /// </summary>
- /// <returns>ViewHolder</returns>
- protected virtual ViewHolder FindFirstVisibleItemView()
- {
- return null;
- }
-
- /// <summary>
- /// FindLastVisibleItemView
- /// </summary>
- /// <returns>ViewHolder</returns>
- protected virtual ViewHolder FindLastVisibleItemView()
- {
- return null;
- }
-
private void RecycleChildrenInt(FlexibleView.Recycler recycler)
{
foreach (ViewHolder holder in mPendingRecycleViews)
{
get
{
- return (int)(ItemView.PositionX - ItemView.Margin.Start);
+ return ItemView.PositionX - ItemView.Margin.Start;
}
}
{
get
{
- return (int)(ItemView.PositionX + ItemView.SizeWidth + ItemView.Margin.End);
+ return ItemView.PositionX + ItemView.SizeWidth + ItemView.Margin.End;
}
}
{
get
{
- return (int)(ItemView.PositionY - ItemView.Margin.Top);
+ return ItemView.PositionY - ItemView.Margin.Top;
}
}
{
get
{
- return (int)(ItemView.PositionY + ItemView.SizeHeight + ItemView.Margin.Bottom);
+ return ItemView.PositionY + ItemView.SizeHeight + ItemView.Margin.Bottom;
}
}
return false;
}
- FlexibleView.ViewHolder anchorChild = FindFirstVisibleItemView();
- if (anchorChild == null)
+ FlexibleView.ViewHolder anchorChild = FindFirstCompleteVisibleItemView();
+ if (anchorChild != null)
{
- Log.Error("flexibleview", $"exception occurs when updating anchor information!");
- anchorChild = GetChildAt(0);
+ return false;
}
anchorInfo.Position = anchorChild.LayoutPosition;
anchorInfo.Coordinate = mOrientationHelper.GetViewHolderStart(anchorChild);
{
if (child.ItemView.Focusable == false || mOrientationHelper.GetViewHolderEnd(child) + scrolled < mOrientationHelper.GetEnd())
{
- layoutState.Available = (int)(MAX_SCROLL_FACTOR * mOrientationHelper.GetTotalSpace());
+ layoutState.Available = MAX_SCROLL_FACTOR * mOrientationHelper.GetTotalSpace();
layoutState.Extra = 0;
layoutState.ScrollingOffset = LayoutState.SCROLLING_OFFSET_NaN;
layoutState.Recycle = false;
{
if (child.ItemView.Focusable == false || mOrientationHelper.GetViewHolderStart(child) + scrolled > 0)
{
- layoutState.Available = (int)(MAX_SCROLL_FACTOR * mOrientationHelper.GetTotalSpace());
+ layoutState.Available = MAX_SCROLL_FACTOR * mOrientationHelper.GetTotalSpace();
layoutState.Extra = 0;
layoutState.ScrollingOffset = LayoutState.SCROLLING_OFFSET_NaN;
layoutState.Recycle = false;
mLayoutState.Extra = mOrientationHelper.GetStartAfterPadding();
}
- /// <summary>
- /// FindFirstVisibleItemView
- /// </summary>
- /// <returns>FlexibleView.ViewHolder</returns>
- protected override FlexibleView.ViewHolder FindFirstVisibleItemView()
+ private FlexibleView.ViewHolder FindFirstVisibleItemView()
{
int childCount = ChildCount;
if (mShouldReverseLayout == false)
for (int i = 0; i < childCount; i++)
{
FlexibleView.ViewHolder child = GetChildAt(i);
- int end = (int)mOrientationHelper.GetViewHolderEnd(child);
- if (end >= 0 && end < (int)mOrientationHelper.GetEnd())
+ if ((int)mOrientationHelper.GetViewHolderEnd(child) > 0)
{
return child;
}
for (int i = childCount - 1; i >= 0; i--)
{
FlexibleView.ViewHolder child = GetChildAt(i);
- int end = (int)mOrientationHelper.GetViewHolderEnd(child);
- if (end >= 0 && end < (int)mOrientationHelper.GetEnd())
+ if ((int)mOrientationHelper.GetViewHolderEnd(child) > 0)
{
return child;
}
for (int i = 0; i < childCount; i++)
{
FlexibleView.ViewHolder child = GetChildAt(i);
- int start = (int)mOrientationHelper.GetViewHolderStart(child);
- if (start > 0 && start < (int)mOrientationHelper.GetEnd())
+ if ((int)mOrientationHelper.GetViewHolderStart(child) > 0)
{
return child;
}
for (int i = childCount - 1; i >= 0; i--)
{
FlexibleView.ViewHolder child = GetChildAt(i);
- int start = (int)mOrientationHelper.GetViewHolderStart(child);
- if (start > 0 && start < (int)mOrientationHelper.GetEnd())
+ if ((int)mOrientationHelper.GetViewHolderStart(child) > 0)
{
return child;
}
return null;
}
- /// <summary>
- /// FindLastVisibleItemView
- /// </summary>
- /// <returns>FlexibleView.ViewHolder</returns>
- protected override FlexibleView.ViewHolder FindLastVisibleItemView()
+ private FlexibleView.ViewHolder FindLastVisibleItemView()
{
int childCount = ChildCount;
if (mShouldReverseLayout == false)
for (int i = childCount - 1; i >= 0; i--)
{
FlexibleView.ViewHolder child = GetChildAt(i);
- int start = (int)mOrientationHelper.GetViewHolderStart(child);
- if (start > 0 && start < (int)mOrientationHelper.GetEnd())
+ if ((int)mOrientationHelper.GetViewHolderStart(child) < (int)mOrientationHelper.GetEnd())
{
return child;
}
for (int i = 0; i < childCount; i++)
{
FlexibleView.ViewHolder child = GetChildAt(i);
- int start = (int)mOrientationHelper.GetViewHolderStart(child);
- if (start > 0 && start < (int)mOrientationHelper.GetEnd())
+ if ((int)mOrientationHelper.GetViewHolderStart(child) < (int)mOrientationHelper.GetEnd())
{
return child;
}