Skip navigation

What is DynaSpot?

DynaSpot figure

DynaSpot is a new pointing technique that facilitates the acquisition of small targets. It is described in detail in the following research paper:

O. Chapuis, J.-B. Labrune, E. Pietriga, DynaSpot: Speed-Dependent Area Cursor, CHI '09: Proceedings of the SIGCHI conference on Human Factors in computing systems, pages 1391-1400, April 2009, Boston, USA

The paper is available from the ACM Digital Library and from the HAL-INRIA open archive.

Abstract (from paper)

We present DynaSpot, a new technique for acquiring targets based on the area cursor. DynaSpot couples the cursor's activation area with its speed, behaving like a point cursor at low speed or when motionless. This technique minimizes visual distraction and allows pointing anywhere in empty space without requiring an explicit mode switch, thus enabling users to perform common interactions such as region selections seamlessly. The results of our controlled experiments show that the performance of DynaSpot can be modeled by Fitts' law, and that DynaSpot significantly outperforms the point cursor and achieves, in most conditions, the same level of performance as one of the most promising techniques to date, the Bubble cursor.

SIGCHI honorable mention DynaSpot gets a CHI 2009 honorable mention (best paper nominee) awarded by SIGCHI.


DynaSpot in ZVTM

The DynaSpot behavior must be activated in VCursor, calling:

aViewInstance.getCursor().activateDynaSpot(true);

In the mouseMoved(...) method of the associated ViewEventHandler (or wherever it makes sense), call:

v.getVCursor().dynaPick(c); // where c is the active camera

This updates the list of glyphs intersected by the DynaSpot circular area (disc), and identifies the one glyph actually selected (which is returned and usually highlighted in the interface).

Note: dynaPick() also gets called internally when DynaSpot's size changes.


The following table summarizes the level of support for DynaSpot picking for each class of Glyph that ships with ZVTM. Subclasses will usually inherit support from the superclass, unless the actual implementation of the subclass changes dramatically from the superclass, as is the case for, e.g., VRectangle and VRectangleOr.

ClassPrecision of DynaSpot picking
fr.inria.zvtm.glyphs.FPolygonDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.RectangleNRHigh precision
fr.inria.zvtm.glyphs.VBoolShapeDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VCbCurveDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VCircleHigh precision
fr.inria.zvtm.glyphs.VDiamondDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VDiamondOrSee fr.inria.zvtm.glyphs.VDiamond
fr.inria.zvtm.glyphs.VEllipseDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VImageHigh precision
fr.inria.zvtm.glyphs.VImageOrDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VOctagonDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VOctagonOrSee fr.inria.zvtm.glyphs.VOctagon
fr.inria.zvtm.glyphs.VPathDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VPointHigh precision
fr.inria.zvtm.glyphs.VPolygonDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VQdCurveDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VRectangleHigh precision
fr.inria.zvtm.glyphs.VRectangleOrHigh precision when orient == 0, DynaSpot disc bounding box precision otherwise
fr.inria.zvtm.glyphs.VRoundRectGlyph bounding box precision (corners considered as squares)
fr.inria.zvtm.glyphs.VSegmentHigh precision
fr.inria.zvtm.glyphs.VShapeDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VSliceDynaSpot disc bounding box precision, except when angle = Pi (not supported yet)
fr.inria.zvtm.glyphs.VTextHigh precision
fr.inria.zvtm.glyphs.VTextOrNot supported yet
fr.inria.zvtm.glyphs.VTriangleDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.VTriangleOrSee fr.inria.zvtm.glyphs.VTriangle
fr.inria.zvtm.glyphs.ZSegmentHigh precision
fr.inria.zvtm.glyphs.CGlyphDepends on each Glyph component (picked individually)
fr.inria.zvtm.glyphs.CircleNRSee fr.inria.zvtm.glyphs.VCircle
fr.inria.zvtm.glyphs.DPathDynaSpot disc bounding box precision
fr.inria.zvtm.glyphs.FRectangleSee fr.inria.zvtm.glyphs.VRectangle
fr.inria.zvtm.glyphs.RImageSee fr.inria.zvtm.glyphs.VImage
fr.inria.zvtm.glyphs.VBTextSee fr.inria.zvtm.glyphs.VText
fr.inria.zvtm.glyphs.VRingDynaSpot disc bounding box precision

Handling Visual Feedback

For DynaSpot to be efficient, it is necessary to give the user continuous visual feedback about the currently selected target (if any). The default behavior when DynaSpot is active in ZVTM is to highlight the glyph currently selected using its highlight color.

It is also possible to customize the behavior. This is done by implementing interface fr.inria.zvtm.engine.SelectionListener and associating that listener with the ZVTM cursor: VCursor.setSelectionListener(...). There is a single callback method, glyphSelected(Glyph g, boolean b) which gets called whenever a glyph gets selected (b=true) or unselected (b=false) by DynaSpot. Setting your own SelectionListener completely overrides the default highlighting behavior (it does not supplement it).