What is DynaSpot?
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.
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:
In the mouseMoved(...) method of the associated ViewEventHandler (or wherever it makes sense), call:
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.
Class | Precision of DynaSpot picking |
---|---|
fr.inria.zvtm.glyphs.FPolygon | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.RectangleNR | High precision |
fr.inria.zvtm.glyphs.VBoolShape | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VCbCurve | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VCircle | High precision |
fr.inria.zvtm.glyphs.VDiamond | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VDiamondOr | See fr.inria.zvtm.glyphs.VDiamond |
fr.inria.zvtm.glyphs.VEllipse | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VImage | High precision |
fr.inria.zvtm.glyphs.VImageOr | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VOctagon | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VOctagonOr | See fr.inria.zvtm.glyphs.VOctagon |
fr.inria.zvtm.glyphs.VPath | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VPoint | High precision |
fr.inria.zvtm.glyphs.VPolygon | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VQdCurve | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VRectangle | High precision |
fr.inria.zvtm.glyphs.VRectangleOr | High precision when orient == 0, DynaSpot disc bounding box precision otherwise |
fr.inria.zvtm.glyphs.VRoundRect | Glyph bounding box precision (corners considered as squares) |
fr.inria.zvtm.glyphs.VSegment | High precision |
fr.inria.zvtm.glyphs.VShape | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VSlice | DynaSpot disc bounding box precision, except when angle = Pi (not supported yet) |
fr.inria.zvtm.glyphs.VText | High precision |
fr.inria.zvtm.glyphs.VTextOr | Not supported yet |
fr.inria.zvtm.glyphs.VTriangle | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.VTriangleOr | See fr.inria.zvtm.glyphs.VTriangle |
fr.inria.zvtm.glyphs.ZSegment | High precision |
fr.inria.zvtm.glyphs.CGlyph | Depends on each Glyph component (picked individually) |
fr.inria.zvtm.glyphs.CircleNR | See fr.inria.zvtm.glyphs.VCircle |
fr.inria.zvtm.glyphs.DPath | DynaSpot disc bounding box precision |
fr.inria.zvtm.glyphs.FRectangle | See fr.inria.zvtm.glyphs.VRectangle |
fr.inria.zvtm.glyphs.RImage | See fr.inria.zvtm.glyphs.VImage |
fr.inria.zvtm.glyphs.VBText | See fr.inria.zvtm.glyphs.VText |
fr.inria.zvtm.glyphs.VRing | DynaSpot 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).