leastfixedpoint

Spring-loaded Zooming UI

This page is a mirrored copy of an article originally posted on the LShift blog; see the archive index here.

The fancy new mouse Apple are selling has a neat hardware feature: squeezing the sides together acts like a button click (on some nth button). They combine it, by default, with a kind of okayish software feature: squeezing the new button shows the dashboard until you stop squeezing.

Looking at CellDesigner’s “bird’s eye view” feature (from the manual) gave mikeb and I an idea: you could use the squeeze-button to control a spring-loaded zoom feature in a Raskinish zooming user interface.

  • The user would start squeezing to begin zooming out. The zoom velocity would smoothly and quickly ramp up to a constant (configurable) rate.
  • Zooming out would continue at that constant rate until either the user releases the squeeze-button (at which point it “drops” you back to the zoom level and position you started from) or the mouse moves more than a (configurable) epsilon from its starting position.
  • If the mouse moves, the zooming process rapidly slows down and stops, hovering over the canvas. The user can use the mouse to pan while the squeeze-button is held in.
  • When the button is finally released, it rapidly drops the camera back to whatever zoom level you used last time you visited this general vicinity. (Not the zoom level you started from. Deciding what the “vicinity” might mean is an interesting problem.)

You could indicate, with a mostly-transparent overlay, where letting go of the button will end up dropping you. When you squeeze, the current view turns transparent while the canvas drops out from underneath you as you rise; while panning, the transparent overlay is updated to reflect the view you’ll get if you let go here; and when you let go, the canvas rises up to meet you as you fall, until it eventually overlaps the transparent view, at which point the transparent view is redundant and can be removed until the next zoom.

Even better would be if the squeeze-button were an analogue control, that could measure pressure like a tablet stylus. You could use the force of squeezing to control the rate of ascent/braking. Then you’d only need that one control for zooming out (so long as there was a way of making your current hover level the new ground level); zooming in could perhaps be done by dragging out a rectangle on the current view that is to expand and become the new view, much as one does with old-school fractal programs.