所以我想做的是使用动力学模型制作一个漂亮的滚动条。问题是抑制过冲。我想展示的行为是,当你过冲(超过最大值/最小值)时,它会抑制定位。
我想要的具体行为是这样的:比如说,Maximumum Overshoot 是 50 像素。这是一张表,表示我希望它如何工作。(这是我能想到的最好的呈现方式)。
Displacement | Position it | Percent
of position | Displays @ | Overshot Over
-------------------------------------------------
25 | 12.5 | 50%
100 | 25 | 100%
200 | 37.5 | 200%
400 | 43.75 | 400%
... ... ...
Note: Decimals would obviously round down so we can actually display it.
我很确定我可以递归计算(但我不想这样做)。我认为数学关系是相当明显的,虽然我不完全确定如何去做。 我什至可能想错了,所以请考虑忽略我的图表。重要的是用户不能将窗口移动到超过最大超调值(在本例中为 50 像素)。
这是运行定位设置的代码段...
function KineticModel:SetPosition(NewPosition)
-- Set's the position of the kinetic model. Using this, it'll calculate velocity.
local CurrentTime = tick()
local ElapsedTime = CurrentTime - self.TimeStamp
local LocalVelocity = ((self.Position - self.LastPosition) * 5) / ElapsedTime
TimeStamp = CurrentTime
self:SetVelocity((0.2 * self.Velocity) + (0.8 * LocalVelocity)) -- 20% previous velocity maintained, 80% of new velocity used.
if NewPosition > self.Maximum then
print("[KineticModel] - Past Max Manual")
local Displacement = math.abs(NewPosition - self.Maximum)
-- Dampen position so it can't go over.
self.Position = self.Maximum + (Displacement / self.MaxBounce) -- This doesn't work. :(
elseif NewPosition < self.Minimum
print("[KineticModel] - Past Min Manual")
local Displacement = math.abs(NewPosition - self.Minimum)
-- Same displacement here
else
self.Position = NewPosition
end
self.LastPosition = self.Position
self.OnPositionChange(self.Position)
print("[KineticModel] - Set Velocity @ "..self.Velocity.."; Local Velocity @ "..LocalVelocity)
end
主要问题是试图找到一种数学方法来找到我应该显示它的位移。我将实现这个位移,基本上在每个点设置之前过滤掉位置,所以如果有潜在的问题,请告诉我。
谢谢。:D
编辑:标题、标签