Tap: co to je, zpracování dotyků v iOS a Android

Autor: IT Sectr Publikováno: 2026-02-27 Doba čtení: 9 min

Tap — základní gesto dotykových rozhraní: jednorázové dotknutí obrazovky prstem s následným uvolněním. Tap je primární akce (primary action) v mobilních operačních systémech — otevírání aplikací, stisk tlačítek, výběr položek seznamu. Je rozpoznán během 100–300 ms a generuje událost kliknutí. Na iOS je zpracováván přes UITapGestureRecognizer, na Android — přes setOnClickListener nebo View.onClick.

Hlavní body

  • Základní gesto — Tap je fundamentální gesto, kterým začíná interakce s dotykovým rozhraním
  • Primary action — Tap vždy provádí hlavní akci: stisk tlačítka, otevření odkazu, výběr prvku
  • UITapGestureRecognizer — hlavní třída iOS pro zpracování Tap s podporou multitouch a vícenásobných dotyků
  • setOnClickListener — standardní metoda Android pro zpracování kliknutí na View
  • Zpoždění — Tap je rozpoznán během 100–300 ms a neměl by mít časový limit pro podržení

Co je Tap?

Tap (dotyk, stisk) — gesto rychlého dotknutí dotykové obrazovky prstem nebo stylusem. Gesto se skládá ze dvou fází: dotyk (touch down) a uvolnění (touch up), které probíhají na stejném místě bez pohybu. Systém rozpozná Tap, když časový interval mezi down a up nepřekročí prahovou hodnotu (obvykle 300–500 ms). Pokud uživatel drží prst déle — gesto se změní na Long Press.

Tap — základ mobilního UX. Na všech mobilních platformách Tap nahrazuje levé kliknutí myši používané v desktopových rozhraních. Na rozdíl od kliknutí myší, Tap nemá modifikátory (Shift+klik, Ctrl+klik) ani hover — toto omezení formuje design mobilních rozhraní. Pro kompenzaci chybějícího náhledu používají mobilní platformy vizuální zpětnou vazbu: highlight při dotyku, efekt ripple v Android, změnu průhlednosti v iOS.

Anatomie Tap zahrnuje pět fází na úrovni systému: probuzení senzoru (dotyk), určení souřadnic, filtrování šumu (prst by se neměl posunout více než o prahovou vzdálenost), čekání na dokončení (uvolnění nebo podržení), klasifikace (Tap, Long Press, Drag). Moderní dotykové ovladače zpracovávají tento cyklus za 8–16 ms při frekvenci dotazování 60–120 Hz.

Tap a Click: jaký je rozdíl?

Tap a Click — různé události s odlišnou fyzikou. Click — událost myši, ke které dochází při stisku a uvolnění tlačítka myši na stejné pozici. Tap — událost dotykové obrazovky, ke které dochází při dotyku prstem. Na mobilních zařízeních prohlížeč převádí Tap na událost click se zpožděním 300–350 ms (pro emulaci dvojitého klepnutí pro zoom). Toto zpoždění bylo historicky problémem mobilního webu, dokud Apple a Google nezavedli meta viewport s user-scalable=no.

ParametrTap (dotykový)Click (myš)
Vstupní zařízeníPrst, stylusKurzor myši
Fázetouchstart → touchendmousedown → mouseup
Náhled (hover)ChybíJe (hover)
Zpoždění0–500 ms0 ms
PřesnostNízká (prst širší než kurzor)Vysoká (pixelová)
ModifikátoryNeShift, Ctrl, Cmd
VícenásobnéMultitouch (2+ prsty)Ne (jeden kurzor)

Touch Events — je samostatné API od Mouse Events. Dotykové události (touchstart, touchmove, touchend) předávají pole dotykových bodů (TouchList), souřadnice, sílu stisku (pressure) a velikost oblasti dotyku (radiusX, radiusY). Mouse Events předává pouze souřadnice kurzoru. Moderní prohlížeče syntetizují click z touchend, pokud nedošlo k pohybu prstu a události touchcancel. Pointer Events API kombinuje oba přístupy a poskytuje jednotné zpracování pro všechna vstupní zařízení.

Tap v iOS: UITapGestureRecognizer

UITapGestureRecognizer — standardní rozpoznávač jednotlivého a vícenásobného Tap v iOS SDK. Podporuje konfiguraci numberOfTapsRequired (počet po sobě jdoucích klepnutí) a numberOfTouchesRequired (počet současně se dotýkajících prstů). Rozpoznávač přechází do stavu UIGestureRecognizerStateRecognized, když uživatel uvolní prst a dotyk nepřekročí práh pohybu.

swift
// UITapGestureRecognizer s podporou Double Tap
class InteractiveImageViewController: UIViewController {

    private var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Single Tap — zobrazit/skrýt ovládací prvky
        let singleTap = UITapGestureRecognizer(
            target: self,
            action: #selector(handleSingleTap)
        )
        imageView.addGestureRecognizer(singleTap)

        // Double Tap — zoomování obrázku
        let doubleTap = UITapGestureRecognizer(
            target: self,
            action: #selector(handleDoubleTap)
        )
        doubleTap.numberOfTapsRequired = 2

        // Single Tap se aktivuje pouze pokud Double Tap není rozpoznán
        singleTap.require(doubleTap.toFail())
        imageView.addGestureRecognizer(doubleTap)
    }

    @objc private func handleSingleTap() { /* zobrazit ovládací prvky */ }
    @objc private func handleDoubleTap() { /* zoomovat */ }
}

Důležitý vzor: při současné podpoře Single a Double Tap je třeba zavolat require(_:toFail:). Bez toho bude single tap reagovat okamžitě, aniž by systém mohl čekat na druhé klepnutí. iOS také podporuje rozpoznávání Tap přes UIControl.addTarget — pro UIButton, UISwitch a další ovládací prvky. Vestavěné ovládací prvky UIKit již mají standardní zpracování Tap a přidání UITapGestureRecognizer na ně může vést ke konfliktům.

Tap v Android: setOnClickListener

View.setOnClickListener — standardní metoda Android SDK pro zpracování kliknutí na View. Když uživatel dotkne View a uvolní prst na stejném prvku (touch down → touch up v rámci View), je volána metoda onClick(). Android automaticky přidává efekt ripple (na API 21+) s animací dotyku. Tlačítko je považováno za stisknuté ve stavu PRESSED, který je vizuálně zobrazen přes selector nebo RippleDrawable.

kotlin
// setOnClickListener ve Fragment s 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()
        }

        // Posluchač s debounce pro prevenci dvojitého kliknutí
        binding.submitButton.setOnClickListener(
            DebouncingClickListener {
                submitForm()
            }
        )
    }

    private fun submitForm() {
        // Odeslání dat formuláře
    }
}

Debounce — důležitý vzor v programování pro Android. Uživatel může omylem stisknout tlačítko dvakrát v krátkém časovém intervalu, což vede k dvojímu odeslání formuláře nebo dvojímu provedení akce. Řešení: obal DebouncingClickListener, který blokuje opakovaná kliknutí po dobu 500–1000 ms. Google doporučuje tento přístup v oficiálních příkladech Android Architecture Components. Pro RecyclerView je k dispozici setOnItemClickListener přes ListAdapter s callback rozhraním.

Vícenásobné dotyky: Double Tap a Triple Tap

Double Tap (dvojité klepnutí) — dva po sobě jdoucí Tap s intervalem nejvýše 300–400 ms. Používá se pro zoomování obrázků (mapy, fotografie), lajky v sociálních sítích (Instagram, Twitter), návrat na začátek seznamu (Phone, Messages). Triple Tap (trojité klepnutí) je vzácnější — používá se hlavně pro funkce usnadnění přístupu (režim celé obrazovky, VoiceOver) a ve hrách.

Implementace Double Tap vyžaduje synchronizaci s Single Tap: pokud přidáte obě gesta na jeden prvek, Single Tap bude fungovat se zpožděním (systém čeká na druhé klepnutí). V iOS je toto zpoždění řízeno přes require(toFail:) — Single Tap je odložen, dokud si systém není jistý, že Double Tap nenastane. V Android se používá GestureDetector.OnDoubleTapListener s callbacky onSingleTapConfirmed a onDoubleTap. onSingleTapConfirmed je volán až po timeoutu, když si je systém jistý, že se jedná o jediné klepnutí.

kotlin
// Double Tap v Android přes 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() // zobrazit/skrýt ovládací prvky
                return true
            }

            override fun onDoubleTap(e: MotionEvent): Boolean {
                zoomToPoint(e.x, e.y) // zoom v bodě dotyku
                return true
            }
        })
    }
}

Instagram-like double tap — populární UX vzor pro sociální aplikace. Dvojité klepnutí na fotografii spouští animaci lajku (ikona srdce). Implementuje se přes GestureDetector v Android nebo UITapGestureRecognizer s numberOfTapsRequired=2 v iOS. Pro animaci se používá Core Animation na iOS a ObjectAnimator/AnimatorSet na Android. Doba odezvy double tap musí být minimální — uživatel očekává okamžitou animaci po druhém klepnutí.

Pravidla použití Tap v rozhraních

Human Interface Guidelines Apple a Material Design Google kladou konkrétní požadavky na Tap. Minimální velikost touch-target: 44×44 pt pro iOS a 48×48 dp pro Android. To odpovídá ~9 mm na obrazovce — velikosti prstového polštářku průměrného dospělého člověka. Vzdálenost mezi dotykovými cíli by měla být alespoň 8 pt/dp, aby se zabránilo falešným dotykům.

PravidloHodnotaOdůvodnění
Minimální velikost cíle44×44 pt (iOS) / 48×48 dp (Android)Průměrná velikost prstového polštářku ~9 mm
Vzdálenost mezi cíli≥8 pt / ≥8 dpPrevence falešných dotyků
Vizuální zpětná vazbaHighlight / RipplePotvrzení registrace dotyku
Doba trvání animace dotyku100–200 msDostačující pro vnímání, nezpomaluje rozhraní
Zpracování Double TapVyžaduje zpoždění Single TapPrevence falešné aktivace
Okrajové oblasti obrazovkyZvětšená zóna zásahuKompenzace držení zařízení

Vizuální zpětná vazba je pro Tap povinná. Uživatel musí vidět, že dotyk byl zaregistrován: změna barvy, opacity, animace ripple nebo highlight. Bez zpětné vazby může uživatel stisknout znovu, což způsobí nežádoucí akce. V iOS standardní animace touch highlight — změna průhlednosti na 0.3 s dobou trvání 0.15 s. V Android — efekt Material ripple šířící se z bodu dotyku. Nepoužívejte zpoždění před vizuální zpětnou vazbou — uživatel by měl vidět reakci současně s dotykem.

Často kladené otázky

Jaký je rozdíl mezi Tap a Click ve vývoji webu?

Tap — dotyková událost, Click — událost myši. V prohlížeči je Tap převeden na Click se zpožděním 300 ms (pro odlišení od Double Tap Zoom). Moderní prohlížeče (Chrome 32+, Safari 9.1+) toto zpoždění vypínají při meta viewport s width=device-width. Použijte Pointer Events API pro jednotné zpracování: pointerdown/pointerup jsou vhodné pro všechna vstupní zařízení (myš, dotyk, stylus).

Jaká je minimální velikost tlačítka pro Tap?

Minimální touch target — 44×44 bodů (iOS) nebo 48×48 dp (Android). To odpovídá přibližně 9×9 mm na fyzické obrazovce. Pokud je tlačítko vizuálně menší (např. ikona 24×24), zvětšete oblast zásahu pomocí UIEdgeInsets (iOS) nebo TouchDelegate (Android). Vzdálenost mezi sousedními cíli by měla být alespoň 8 jednotek, aby se předešlo falešným dotykům.

Jak zabránit dvojitému kliknutí na tlačítko?

Double-click prevention se implementuje pomocí mechanismu debounce: po prvním kliknutí je tlačítko blokováno na 500–1000 ms. V Android použijte DebouncingClickListener (hotové řešení z Architecture Components). V iOS — vypněte isEnabled tlačítka ihned po stisknutí a zapněte přes DispatchQueue.main.asyncAfter. Ve webových aplikacích — nastavte příznak disabled na prvku button po prvním kliknutí.

Co je Long Tap a čím se liší od Tap?

Long Tap (Long Press) — podržení prstu na obrazovce po dobu 500+ ms bez pohybu. Tap — rychlý dotyk (100–300 ms). Tap provádí hlavní akci (Primary Action), Long Tap — sekundární (kontextová nabídka, úpravy). V iOS je Tap zpracováván UITapGestureRecognizer, Long Press — UILongPressGestureRecognizer. V Android — setOnClickListener vs setOnLongClickListener.

Podporují stylusy Apple Pencil a S Pen Tap?

Ano, stylusy jsou zpracovávány jako Tap přes standardní dotykové API. Apple Pencil předává force (síla stisku), altitudeAngle (úhel sklonu) a azimuth (azimut). S Pen v Android předává podobné parametry přes MotionEvent.getPressure() a getAxisValue(MotionEvent.AXIS_TILT). Pro stylusy lze touch target snížit na 24×24 bodů, protože přesnost stylusu je vyšší než prstu.

Shrnutí

  • Tap — rychlé gesto dotyku (100–300 ms), hlavní akce mobilního rozhraní
  • Rozdíl od Long Press — Tap nemá časový limit podržení a provádí se okamžitě
  • iOS API — UITapGestureRecognizer s numberOfTapsRequired a numberOfTouchesRequired
  • Android API — View.setOnClickListener a GestureDetector.OnDoubleTapListener
  • Double Tap — dva po sobě jdoucí Tap s intervalem až 400 ms pro zoom a lajky
  • Touch target — minimální velikost cíle 44×44 pt (iOS) nebo 48×48 dp (Android)
  • Vizuální zpětná vazba — povinná pro potvrzení registrace dotyku

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také