here is the code for the android scroller if you want to look again
Code: Select all
local xStart,yStart,hScrollStart,vScrollStart,tLastLoc,allowDrag,scrollChunks
on mouseDown
--###cancel item 1 of line lineOffset("runEase",pendingMessages()) of pendingMessages()
cancelEaseMsgs
put "" into tLastLoc
put "" into scrollChunks
put mouseH() into xStart
put mouseV() into yStart
put hScroll of me into hScrollStart
put vScroll of me into vScrollStart
put true into allowDrag
end mouseDown
on mouseMove X,Y
if not allowDrag then exit mouseMove
lock screen
--### set hScroll of me to hScrollStart + (xStart - X)
set vScroll of me to vScrollStart + (yStart - Y)
unlock screen
if "storeScrollChunks" is not in pendingMessages() then send "storeScrollChunks X,Y" to me in 100 millisecs
put X,Y into tLastLoc
end mouseMove
on storeScrollChunks pX,pY
put item 1 of tLastLoc - pX,item 2 of tLastLoc - pY into scrollChunks
end storeScrollChunks
on mouseUp
prepareScroll
end mouseUp
on mouseRelease
prepareScroll
end mouseRelease
command prepareScroll
put false into allowDrag
put 4 into xMultiplier
put 1700 into xDuration
if abs(item 1 of scrollChunks) < 100 then
put 3 into xMultiplier
put 1000 into xDuration
end if
put 4 into yMultiplier
put 1700 into yDuration
if abs(item 2 of scrollChunks) < 100 then
put 3 into yMultiplier
put 1000 into yDuration
end if
put max(xDuration,yDuration) into pDuration
--### put hScroll of me - (xMultiplier * item 1 of scrollChunks),vScroll of me - (xMultiplier * item 2 of scrollChunks) into pDestScroll
put 0,vScroll of me - (xMultiplier * item 2 of scrollChunks) into pDestScroll
easeScroll long ID of me,pDestScroll,pDuration
end prepareScroll
local tStartScroll,tDistance,tStartTime,tEaseID,bounceBackBusy
command easeScroll pObj,pDestScroll,pDuration
# CANCEL ANY EXISTING EASE MOVEMENT
--### cancel item 1 of line lineOffset("runEase",pendingMessages()) of pendingMessages()
cancelEaseMsgs
put empty into tEaseID
put false into bounceBackBusy
# BEGIN EASE ROUTINE
runEase pObj,pDestScroll,pDuration
end easeScroll
on cancelEaseMsgs --###jg
repeat for each line l in the pendingmessages
if l contains "runease" then cancel item 1 of l
end repeat
end cancelEaseMsgs
-- NOTE: HOSTOBJ PARAMETER IS ONLY USED LOCALLY
-- AND SHOULD BE EMPTY WHEN ROUTINE IS FIRST RUN
-- TO INITIALIZE EASE MOVEMENT
command runEase pObj,pDestScroll,pDuration,pHostObj
lock screen
# INIT VARIABLES
if pHostObj = "" then
put item 1 of line 1 of the executionContexts into pHostObj
put hScroll of pObj,vScroll of pObj into tStartScroll
put (item 1 of pDestScroll - item 1 of tStartScroll),(item 2 of pDestScroll - item 2 of tStartScroll) into tDistance
put the millisecs into tStartTime
end if
# TRACK TIME
put (the millisecs - tStartTime)/pDuration into phi
put min(phi,1) into phi
put (2*phi - phi^2) into tEase # EASE OUT
# MOVE OBJECT
put 0 into newHScroll --### put item 1 of tStartScroll + round(tEase * item 1 of tDistance) into newHScroll
put item 2 of tStartScroll + round(tEase * item 2 of tDistance) into newVScroll
set hScroll of pObj to newHScroll
set vScroll of pObj to newVScroll
unlock screen
# REVERSE DIRECTION (BOUNCEBACK) IF END OF SCROLL IS REACHED
put hScroll of pObj,vScroll of pObj into currScroll
put 0 into hBounce
put 0 into vBounce
if item 1 of currScroll < minHScroll(pObj) then put 1 into hBounce
if item 1 of currScroll > maxHScroll(pObj) then put -1 into hBounce
if item 2 of currScroll < minVScroll(pObj) then put 1 into vBounce
if item 2 of currScroll > maxVScroll(pObj) then put -1 into vBounce
if (hBounce <> 0 or vBounce <> 0) and not bounceBackBusy then
send "bounceBack pObj,hBounce,vBounce" to me in 10 millisecs
exit runEase
end if
# EXIT WHEN OBJECT REACHES ITS DESTINATION
if ((newHScroll,newVScroll) = pDestScroll) or (phi >= 1) then
put empty into tEaseID
put false into bounceBackBusy
-- try
-- send "easeScrollDone pObj" to pHostObj
-- end try
exit runEase
end if
# LOOP SCRIPT
send "runEase pObj,pDestScroll,pDuration,pHostObj" to me in 10 milliseconds
put the result into tEaseID
end runEase
command bounceBack pObj,hBounce,vBounce
exit bounceBack --###jg: no bounce on android
put true into bounceBackBusy
put hScroll of pObj,vScroll of pObj into pDestScroll
if hBounce = 1 then put minHScroll(pObj) into item 1 of pDestScroll
if hBounce = -1 then put maxHScroll(pObj) into item 1 of pDestScroll
if vBounce = 1 then put minVScroll(pObj) into item 2 of pDestScroll
if vBounce = -1 then put maxVScroll(pObj) into item 2 of pDestScroll
put 500 into pDuration
runEase pObj,pDestScroll,pDuration
end bounceBack
function minHScroll pObj
return item 1 of marginValues(pObj)
end minHScroll
function maxHScroll pObj
if formattedWidth of pObj <= width of pObj then return width of pObj
return (formattedWidth of pObj - item 3 of marginValues(pObj) - width of pObj)
end maxHScroll
function minVScroll pObj
return item 2 of marginValues(pObj)
end minVScroll
function maxVScroll pObj
if formattedHeight of pObj <= height of pObj then return height of pObj
return (formattedHeight of pObj - item 4 of marginValues(pObj) - height of pObj)
end maxVScroll
function marginValues pObj
if number of items of margins of pObj > 1 then return margins of pObj
repeat 4
put margins of pObj & "," after tValues
end repeat
delete last char of tValues
return tValues
end marginValues