The reason is simple :
- On the computer, everytime you *do* something ( move the mouse, etc. ), the screen gets refreshed.
- On the handheld, platform.window:invalidate() has to be called. You wanted that by calling it in [lua]on.timer[/lua], but you forgot to do [lua]timer.start[/lua](0.01) to actually start the timer.
Instead of doing that, you could simply put the invalidate at the end of the arrow functions. (Btw, you can also use [lua]on.arrowKey[/lua](arrow) (arrow=="left" etc.)
Also, don't put platform.window:invalidate() inside of on.paint, it's useless.