如何从滚动条计算视口?

时间:2010-07-14 20:56:14

标签: math scroll

这可能是直截了当的,但由于某些原因我无法破解它(实际上它是因为我在数学上很可怕!)。

我有一个视口,一次显示800个像素,我想在虚拟像素数上移动它,比如2400像素宽。

我使用滚动条(0-1)的相对位置来确定视口应移动到的虚拟像素。

我有一个循环n = 800,我经历过。 我想从滑块告诉我的位置开始读取一系列plottin点,并从那一点开始迭代接下来的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 个答案:

答案 0 :(得分:3)

滚动条的范围应该是最左边像素可以拍摄的范围,而不是所有像素的范围。

所以你的范围是1600(2400 - 800),而不是2400。这是您应该用于确定偏移量的比例因子。

作为一个警告,总是在这些事情中注意一个错误。由于您的条形范围从0到1,因此如果您不小心,输出的像素范围将介于0到800之间,如果您不注意,可能会溢出阵列:)。

答案 1 :(得分:1)

答案实际上非常简单 - 不是让相对位置在整个宽度上滑动(这就是你上面的那个),而是从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