Как вычислить область просмотра из полосы прокрутки? - PullRequest
1 голос
/ 15 июля 2010

Это, вероятно, достаточно просто, но по какой-то причине я просто не могу его взломать (ну, на самом деле это потому, что я ужасно разбираюсь в математике!).

У меня есть окно просмотра, которое показывает 800 пикселей за раз, и я хочу переместить его влево и вправо на виртуальное количество пикселей, скажем, 2400 пикселей в ширину.

Я использую относительное положение полосы прокрутки (0-1), чтобы определить виртуальный пиксель, в который должен был переместиться видовой экран.

У меня есть цикл n = 800, через который я бегу. Я хочу начать чтение массива точек заговора с позиции, указанной мне ползунком, и перебрать следующие 800 точек из этой точки.

Проблема, с которой я столкнулся, заключается в том, что моя полоса прокрутки полностью направлена ​​вправо, а ее относительное положение = 1, моя точка чтения = 2400 ..... что, в некотором смысле, правильно. Но это заставляет мое положение чтения точек рисования переходить к последней точке, и когда я начинаю свою итерацию, у меня не остается точек для чтения.

Исходя из того, что я переместил анализ скользящей рамки шириной 800 пикселей, левая точка рамки в этом случае должна быть 1600, а ее правая точка - 2400

Как мне этого добиться?

Нужна ли какая-то формула отображения значений?

        private function calculateShuttleRelativePosition():void
        {

            var _x:Number=_scrollthumb.x
            _sliderCenter=_x + (_scrollthumb.width / 2)
            _sliderRange=_scrollbar.width - _scrollthumb.width;
            _slider_rel_pos=(_sliderCenter - _sliderCenterMinLeft) / _sliderRange

        }



pixel = slider relative position * 2400
readpoint= pixel

Ответы [ 2 ]

3 голосов
/ 15 июля 2010

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

Таким образом, ваш диапазон будет 1600 (2400 - 800), а не 2400 в одиночку. Это коэффициент масштабирования, который вы должны применять для определения смещения.

В качестве предупреждающего слова всегда следите за ошибками в подобных вещах. Поскольку ваша полоса колеблется от 0 до 1, ваши выводимые пиксели будут варьироваться от 0 до 800, если вы не будете осторожны, что может привести к переполнению массива, если вы не будете следить:)

1 голос
/ 15 июля 2010

Ответ на самом деле довольно прост - вместо того, чтобы относительное положение скользило по всей ширине (что у вас есть выше), вы начинаете с 0 и бежите до ширины - 800 (или ширины окна просмотра).

Какой-то код C-ish будет выглядеть так:

int viewPortWidth = 800;
int virtualWindowWidth = 2400;

// I'm assuming your code above is right -- I didn't check
float sliderRelativePosition = calculateShuttleRelativePosition(); 

// The casts (int and float here), make sure that you're rounding down to an integer 
// pixel between 0 and virtualWindowWidth - 1, inclusive
int pixel = (int)(sliderRelativePosition * (float)(virtualWindowWidth - viewPortWidth - 1));

readPixels(pixel, viewPortWidth);  // Function that loops through the pixels you want
...