Как создать список прокрутки, в котором не всегда одинаковое количество строк? - PullRequest
0 голосов
/ 21 мая 2019

В моем списке прокрутки не всегда одинаковое количество строк, и я хочу отключить прокрутку вниз, когда последняя строка полностью видна в нижней части списка прокрутки.

Но сейчас это все еще возможнопрокрутить вниз, если последняя строка (в данном случае строка 13) полностью видна внизу списка.Затем оно выглядит как третье изображение (после дополнительной прокрутки), но я хочу, чтобы оно выглядело как второе изображение (после прокрутки).

Что можно сделать, чтобы вы не могли продолжить прокрутку вниз после того, как последняя строкаполностью видимый?

ОБНОВЛЕНИЕ: Это работает сейчас.В этой версии кода используется переменная скорость прокрутки.

scroll list pictures

Мой код:

//Creating the scroll list: 

public List<Vector2> ScrolllistInitialRowPosYList = new List<Vector2>();
public List<Vector2> ScrolllistRowPosYList = new List<Vector2>();
Microsoft.Xna.Framework.Rectangle ScrollPointRectangle, tappRect, ScrollRectangle;
int ScrollLimitTopPosY = 200, ScrollLimitBottomPosY = 400, RowHeight = 60, ScrollPointStartPosY;
float ScrollAreaHeight, HeightallRows, ScrollSpeed;

ScrollPointStartPosY = ScrollLimitTopPosY;
ScrollPointRectangle = new Microsoft.Xna.Framework.Rectangle(500, ScrollPointStartPosY, ScrollPointSprite.Width, ScrollPointprite.Height);
tappRect = new Microsoft.Xna.Framework.Rectangle(-150, -100, 10, 10);
ScrollRectangle = new Microsoft.Xna.Framework.Rectangle(500, 300, ScrollRectangleSprite.Width, ScrollRectangleSprite.Height);

int FirstRowPosY = 0;
int NumberofRows = 13;
ScrollAreaHeight = ScrollLimitBottomPosY - ScrollLimitTopPosY;
int ListViewportHeight = 6 * RowHeight;
HeightallRows = NumberofRows * RowHeight - ListViewportHeight;

ScrollSpeed = HeightallRows / ScrollAreaHeight;

for (int i = 0; i <= NumberofRows - 1; i++)
{
     ScrolllistInitialRowPosYList.Add(new Vector2(500, FirstRowPosY));
     ScrolllistRowPosYList.Add(new Vector2(500, FirstRowPosY));                     
     FirstRowPosY += RowHeight;
}

//Updating gestures:

                    case GestureType.FreeDrag:
                    if (tappRect.Intersects(ScrollRectangle))
                    {
                        tappRect = new Microsoft.Xna.Framework.Rectangle((int)gs.Position.X, (int)gs.Position.Y, 10, 10);

                            if (gs.Delta.Y > 0)
                            {
                             if (ScrollPointRectangle.Y >= ScrollLimitTopPosY + 2)
                                ScrollPointRectangle = new Microsoft.Xna.Framework.Rectangle(500, ScrollPointRectangle.Y - 2, ScrollPointSprite.Width, ScrollPointSprite.Height);
                          else
                                ScrollPointRectangle = new Microsoft.Xna.Framework.Rectangle(500, ScrollLimitTopPosY, ScrollPointSprite.Width, ScrollPointSprite.Height);
                            }
                            else
                            {
                                if (gs.Delta.Y < 0)
                                {
                                    if (ScrollPointRectangle.Y <= ScrollLimitBottomPosY - 2)
                                      ScrollPointRectangle = new Microsoft.Xna.Framework.Rectangle(500, ScrollPointRectangle.Y + 2, ScrollPointSprite.Width, ScrollPointSprite.Height);
                                    else
                                      ScrollPointRectangle = new Microsoft.Xna.Framework.Rectangle(500, ScrollLimitBottomPosY, ScrollPointSprite.Width, ScrollPointSprite.Height);
                                }
                            }
                    }
                    break;

//Updating the scroll list after someone srolled up or down:

        for (int i = 0; i <= ScrolllistRowPosYList.Count - 1; i++)
        {
            int ScrollPosYCurrent = ScrollPointRectangle.Y;

            int ScrollPosYDifference = ScrollPosYCurrent - ScrollPointStartPosY;
            float RowPosYDifference = ScrollSpeed * ScrollPosYDifference;

            int RowInitialPosY = (int)ScrolllistInitialRowPosYList[i].Y;

            float RowCurrentPosY = RowInitialPosY - RowPosYDifference;

            ScrolllistRowPosYList[i] = new Vector2(ScrolllistRowPosYList[i].X, RowCurrentPosY);
        }

1 Ответ

0 голосов
/ 21 мая 2019
  1. Вы можете просто не рисовать их.
  2. У вас может быть 2 List<row> переменных, где одна будет хранить все строки, а другая - только те, которые должны просматриваться и взаимодействовать.

РЕДАКТИРОВАТЬ : Я не прочитал.Забудьте первый пункт, который я написал.Используйте два списка, как во втором пункте.При прокрутке проверьте, является ли последняя видимая строка последней строкой в ​​вашем списке «все строки».Если это так, не прокручивайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...