Vstup se nezahazuje jen proto, že běží animace
Marcin Wichary popsal drobnost, která odhalí celý přístup k návrhu. Otoč fotku osmkrát rychle za sebou — mají to být dvě celé otočky, snímek skončí tam, kde začal. iPhone to tak udělá. Nothing Phone s Androidem skončí v polovině. Stejné gesto, jiný výsledek. Rozdíl není v rychlosti animace, ale v tom, co se stane s klepnutím, které přijde, když animace ještě běží.
Osm klepnutí, čtyři otočky
iPhone čekající klepnutí neztratí. Zařadí je do fronty a provede hned, jak předchozí otočka doběhne. Android během animace klepnutí ignoruje — přehraje haptickou i zvukovou odezvu, ale akci neprovede.
To je horší, než kdyby neudělal nic. Odezva totiž lže. Uživateli potvrdí, že klepnutí dorazilo, a přitom ho zahodí. Člověk se spolehne na zpětnou vazbu, klepe dál v rytmu a napočítá o polovinu míň, než čekal.
Casual rozhraní potká power usera
Wichary tomu říká situational power user-ness. Rozhraní navržené pro občasné, ležérní použití nečekaně narazí na někoho, kdo ho maká naostro. Kdo skenuje štos dokumentů nafocených na šířku a potřebuje každý z nich otočit. V tu chvíli přestává být ležérním uživatelem — je to dávkové zpracování a animace mu překáží.
Nemůžeš dopředu vědět, kdo tím power userem bude. Je to stejná logika jako u situational disability: skoro každý se občas dostane do dočasného omezení, kdy najednou záleží na věcech, které jinak přehlédne. Návrh pro ten okamžik pomáhá všem.
Bufferování není jediná odpověď
Wichary je opatrný: „bufferovat klepnutí není jediná odpověď". Můžeš animaci na nový vstup zastavit. Můžeš ji zrychlit. Jde o invariant pod tím: „nikdy nenuť uživatele čekat, až animace doběhne".
Animace je zpětná vazba, ne brána. Ve chvíli, kdy onClick ignoruješ, protože zrovna běží přechod, jsi z animace udělal bránu — a vstup drží jako rukojmí. Jediná práce tlačítka je přijmout vstup. Nesmíš ji podřídit tomu, jestli doběhla nějaká efektní tranzice.
Co si z toho odnést
Až příště napíšeš handler, který je během animace zablokovaný nebo přeskočený, vzpomeň si na ten štos fotek. Uživatel v ráži do té brány narazí a ty přijdeš o polovinu jeho gest. Odděl přijetí vstupu od stavu animace: zařaď do fronty, přeruš, nebo zrychli. Návrh dělej pro okamžik, kdy tvoje ležérní rozhraní potká power usera — protože ho potká.