Tap — het basisgebaar van aanraakinterfaces: eenmalig het scherm aanraken met een vinger en vervolgens loslaten. Tap is de primaire actie (primary action) in mobiele besturingssystemen — apps openen, knoppen indrukken, lijstitems selecteren. Het wordt binnen 100–300 ms herkend en genereert een klikgebeurtenis. Op iOS wordt het verwerkt via UITapGestureRecognizer, op Android — via setOnClickListener of View.onClick.
Belangrijkste
Tap (aanraking, druk) — het gebaar van het snel aanraken van het aanraakscherm met een vinger of stylus. Het gebaar bestaat uit twee fasen: aanraken (touch down) en loslaten (touch up), die op dezelfde plaats plaatsvinden zonder beweging. Het systeem herkent Tap wanneer het tijdsinterval tussen down en up de drempelwaarde (meestal 300–500 ms) niet overschrijdt. Als de gebruiker de vinger langer vasthoudt — verandert het gebaar in Long Press.
Tap — de basis van mobiele UX. Op alle mobiele platforms vervangt Tap de linkermuisklik die in desktopinterfaces wordt gebruikt. In tegenstelling tot een muisklik heeft Tap geen modifiers (Shift+klik, Ctrl+klik) en hover — deze beperking vormt het ontwerp van mobiele interfaces. Om het gebrek aan voorbeeld te compenseren, gebruiken mobiele platforms visuele feedback: highlight bij aanraking, ripple-effect in Android, verandering van transparantie in iOS.
Anatomie van Tap omvat vijf fasen op systeemniveau: het wekken van de sensor (aanraking), bepalen van coördinaten, filtering van ruis (de vinger mag niet meer dan de drempelafstand bewegen), wachten op voltooiing (loslaten of vasthouden), classificatie (Tap, Long Press, Drag). Moderne aanraakcontrollers verwerken deze cyclus in 8–16 ms bij een pollingfrequentie van 60–120 Hz.
Tap en Click — verschillende gebeurtenissen met verschillende fysica. Click — een muisgebeurtenis die optreedt bij het indrukken en loslaten van de muisknop op dezelfde positie. Tap — een gebeurtenis op het aanraakscherm die optreedt bij aanraking met de vinger. Op mobiele apparaten converteert de browser Tap naar een click-gebeurtenis met een vertraging van 300–350 ms (om dubbeltikken voor zoomen te emuleren). Deze vertraging was historisch een probleem van het mobiele web, totdat Apple en Google meta viewport met user-scalable=no introduceerden.
| Parameter | Tap (aanraking) | Click (muis) |
|---|---|---|
| Invoerapparaat | Vinger, stylus | Muis cursor |
| Fasen | touchstart → touchend | mousedown → mouseup |
| Voorbeeld (hover) | Afwezig | Aanwezig (hover) |
| Vertraging | 0–500 ms | 0 ms |
| Nauwkeurigheid | Laag (vinger breder dan cursor) | Hoog (pixel) |
| Modifiers | Geen | Shift, Ctrl, Cmd |
| Meerdere | Multitouch (2+ vingers) | Geen (één cursor) |
Touch Events — is een aparte API van Mouse Events. Aanraakgebeurtenissen (touchstart, touchmove, touchend) geven een array van aanraakpunten (TouchList), coördinaten, drukkracht (pressure) en de grootte van het aanraakgebied (radiusX, radiusY). Mouse Events geeft alleen cursorcoördinaten. Moderne browsers synthetiseren click uit touchend, als er geen vingerbeweging en touchcancel-gebeurtenis was. Pointer Events API combineert beide benaderingen en biedt uniforme verwerking van alle invoerapparaten.
UITapGestureRecognizer — de standaard herkenner voor enkele en meervoudige Tap in iOS SDK. Ondersteunt configuratie van numberOfTapsRequired (aantal opeenvolgende tikken) en numberOfTouchesRequired (aantal gelijktijdig aanrakende vingers). De herkenner gaat naar de status UIGestureRecognizerStateRecognized wanneer de gebruiker de vinger loslaat en de aanraking de bewegingsdrempel niet overschrijdt.
// UITapGestureRecognizer met ondersteuning voor Double Tap
class InteractiveImageViewController: UIViewController {
private var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Single Tap — bedieningselementen tonen/verbergen
let singleTap = UITapGestureRecognizer(
target: self,
action: #selector(handleSingleTap)
)
imageView.addGestureRecognizer(singleTap)
// Double Tap — zoomen van afbeelding
let doubleTap = UITapGestureRecognizer(
target: self,
action: #selector(handleDoubleTap)
)
doubleTap.numberOfTapsRequired = 2
// Single Tap werkt alleen als Double Tap niet wordt herkend
singleTap.require(doubleTap.toFail())
imageView.addGestureRecognizer(doubleTap)
}
@objc private func handleSingleTap() { /* bedieningselementen tonen */ }
@objc private func handleDoubleTap() { /* zoomen */ }
}Belangrijk patroon: bij gelijktijdige ondersteuning van Single en Double Tap moet require(_:toFail:) worden aangeroepen. Zonder dit zal single tap onmiddellijk reageren, waardoor het systeem niet kan wachten op de tweede tik. iOS ondersteunt ook herkenning van Tap via UIControl.addTarget — voor UIButton, UISwitch en andere bedieningselementen. Ingebouwde UIKit-besturingselementen hebben al standaard Tap-verwerking en het toevoegen van UITapGestureRecognizer erover kan leiden tot conflicten.
View.setOnClickListener — de standaard Android SDK-methode voor het verwerken van klikken op View. Wanneer de gebruiker View aanraakt en de vinger op hetzelfde element loslaat (touch down → touch up binnen View), wordt de methode onClick() aangeroepen. Android voegt automatisch een ripple-effect (op API 21+) met aanraakanimatie toe. De knop wordt als ingedrukt beschouwd in de status PRESSED, die visueel wordt weergegeven via een selector of RippleDrawable.
// setOnClickListener in Fragment met Data Binding
class ItemListFragment : Fragment() {
private var binding: FragmentItemListBinding? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentItemListBinding.bind(view)
binding.submitButton.setOnClickListener {
submitForm()
}
// Listener met debounce om dubbelklikken te voorkomen
binding.submitButton.setOnClickListener(
DebouncingClickListener {
submitForm()
}
)
}
private fun submitForm() {
// Verzenden van formuliergegevens
}
}Debounce — een belangrijk patroon in Android-programmering. De gebruiker kan per ongeluk tweemaal op de knop drukken in een korte tijd, wat leidt tot dubbele verzending van het formulier of dubbele uitvoering van de actie. Oplossing: een DebouncingClickListener-wrapper die herhaalde klikken blokkeert gedurende 500–1000 ms. Google raadt het gebruik van deze benadering aan in de officiële voorbeelden van Android Architecture Components. Voor RecyclerView is setOnItemClickListener voorzien via ListAdapter met een callback-interface.
Double Tap (dubbele tik) — twee opeenvolgende Tap's met een interval van maximaal 300–400 ms. Gebruikt voor het zoomen van afbeeldingen (kaarten, foto's), likes in sociale netwerken (Instagram, Twitter), terugkeren naar het begin van de lijst (Phone, Messages). Triple Tap (driedubbele tik) komt minder vaak voor — voornamelijk gebruikt voor toegankelijkheidsfuncties (volledig scherm, VoiceOver) en in games.
Implementatie van Double Tap vereist synchronisatie met Single Tap: als u beide gebaren aan één element toevoegt, werkt Single Tap met vertraging (het systeem wacht op de tweede tik). In iOS wordt deze vertraging gecontroleerd via require(toFail:) — Single Tap wordt uitgesteld tot het systeem zeker weet dat Double Tap niet zal plaatsvinden. In Android wordt GestureDetector.OnDoubleTapListener gebruikt met callbacks onSingleTapConfirmed en onDoubleTap. onSingleTapConfirmed wordt alleen aangeroepen na een time-out, wanneer het systeem zeker is dat het een enkele tik is.
// Double Tap in Android via GestureDetector
class PhotoViewerActivity : AppCompatActivity() {
private var gestureDetector: GestureDetector? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
toggleControls() // bedieningselementen tonen/verbergen
return true
}
override fun onDoubleTap(e: MotionEvent): Boolean {
zoomToPoint(e.x, e.y) // zoom op aanraakpunt
return true
}
})
}
}Instagram-like double tap — een populair UX-patroon voor sociale apps. Dubbeltikken op een foto activeert de like-animatie (harticoon). Geïmplementeerd via GestureDetector in Android of UITapGestureRecognizer met numberOfTapsRequired=2 in iOS. Voor animatie wordt Core Animation op iOS en ObjectAnimator/AnimatorSet op Android gebruikt. De responstijd van double tap moet minimaal zijn — de gebruiker verwacht onmiddellijke animatie na de tweede tik.
Human Interface Guidelines van Apple en Material Design van Google stellen specifieke eisen aan Tap. Minimale grootte van touch-target: 44×44 pt voor iOS en 48×48 dp voor Android. Dit komt overeen met ~9 mm op het scherm — de grootte van het vingerkussen van een gemiddelde volwassene. De afstand tussen touch-doelen moet ten minste 8 pt/dp zijn om valse aanrakingen te voorkomen.
| Regel | Waarde | Motivatie |
|---|---|---|
| Minimale grootte van doel | 44×44 pt (iOS) / 48×48 dp (Android) | Gemiddelde grootte vingerkussen ~9 mm |
| Afstand tussen doelen | ≥8 pt / ≥8 dp | Voorkomen van valse aanrakingen |
| Visuele feedback | Highlight / Ripple | Bevestiging van registratie van aanraking |
| Duur van aanraakanimatie | 100–200 ms | Voldoende voor perceptie, vertraagt interface niet |
| Verwerking van Double Tap | Vereist vertraging van Single Tap | Voorkomen van valse activering |
| Randgebieden van scherm | Vergroot raakgebied | Compensatie voor vasthouden apparaat |
Visuele feedback is verplicht voor Tap. De gebruiker moet zien dat de aanraking is geregistreerd: kleurverandering, opacity, ripple-animatie of highlight. Zonder feedback kan de gebruiker opnieuw drukken, wat ongewenste acties veroorzaakt. In iOS is de standaard touch highlight-animatie — verandering van transparantie naar 0.3 met een duur van 0.15 s. In Android — het Material ripple-effect dat zich verspreidt vanaf het aanraakpunt. Gebruik geen vertraging vóór visuele feedback — de gebruiker moet de reactie gelijktijdig met de aanraking zien.
Veelgestelde vragen
Tap — een aanraakgebeurtenis, Click — een muisgebeurtenis. In de browser wordt Tap omgezet in Click met een vertraging van 300 ms (om te onderscheiden van Double Tap Zoom). Moderne browsers (Chrome 32+, Safari 9.1+) schakelen deze vertraging uit bij meta viewport met width=device-width. Gebruik Pointer Events API voor uniforme verwerking: pointerdown/pointerup zijn geschikt voor alle invoerapparaten (muis, aanraking, stylus).
Minimale touch target — 44×44 punten (iOS) of 48×48 dp (Android). Dit komt overeen met ongeveer 9×9 mm op het fysieke scherm. Als de knop visueel kleiner is (bijv. pictogram 24×24), vergroot dan het hit-gebied via UIEdgeInsets (iOS) of TouchDelegate (Android). De afstand tussen aangrenzende doelen moet ten minste 8 eenheden zijn om valse aanrakingen te voorkomen.
Double-click prevention wordt geïmplementeerd via een debounce-mechanisme: na de eerste klik wordt de knop geblokkeerd gedurende 500–1000 ms. Gebruik in Android DebouncingClickListener (kant-en-klare oplossing uit Architecture Components). In iOS — schakel isEnabled van de knop direct na het indrukken uit en schakel het in via DispatchQueue.main.asyncAfter. In webapplicaties — stel de disabled-vlag in op het button-element na de eerste klik.
Long Tap (Long Press) — het vasthouden van de vinger op het scherm gedurende 500+ ms zonder beweging. Tap — snelle aanraking (100–300 ms). Tap voert de hoofdactie (Primary Action) uit, Long Tap — de secundaire actie (contextmenu, bewerken). In iOS wordt Tap verwerkt door UITapGestureRecognizer, Long Press door UILongPressGestureRecognizer. In Android — setOnClickListener vs setOnLongClickListener.
Ja, stylussen worden verwerkt als Tap via de standaard aanraak-API. Apple Pencil geeft force (drukkracht), altitudeAngle (kantelhoek) en azimuth (azimut) door. S Pen in Android geeft vergelijkbare parameters door via MotionEvent.getPressure() en getAxisValue(MotionEvent.AXIS_TILT). Voor stylussen kan de touch target worden verkleind tot 24×24 punten, omdat de precisie van een stylus hoger is dan die van een vinger.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook