Přejít k navigační liště

Zdroják » Webdesign » Dotýkejte se, prosím, jemněji…

Dotýkejte se, prosím, jemněji…

Články Webdesign

V minulém článku jsme si představili metody pro sledování a zachytávání dotykových gest pro zvětšení, zmenšení a natočení (známá gesta dvěma prsty). V tomto článku přijde na řadu sledování konkrétního dotyku prstu na dotykové ploše a jeho pohybu, a to na velmi nízké úrovni.

Jemnější (a víc „lowlevel“) sledování dotyků nabízí události touch. S nimi můžete sledovat jednotlivé body dotyku a jejich pohyb po ploše, ovšem na druhou stranu musíte například výše popsaná gesta „vydedukovat“ sami, algoritmem. Jediné, co máte k dispozici, jsou totiž jen souřadnice míst, kde se nacházejí uživatelovy prsty.

Při práci s API dotyků zachytáváme následující události:

  • ontouchstart – uživatel se dotkl obrazovky
  • ontouchmove – uživatel pohybuje prstem po ploše
  • ontouchend – uživatel zdvihl prst
  • ontouchcancel – pohyb prstem byl systémem přerušen
  • ontouchenter – vyvolána, když se prst, který se už dotýká povrchu, přesune do sledovaného elementu (tedy dotyk vznikl někde jinde) 
  • ontouchleave – prst opustí sledovaný element

Poslední dvě události ještě většinou nebývají implementované; podle informací je implementuje prohlížeč v Androidu, ale autor bohužel neměl možnost otestovat. V prohlížeči v iPad 2 nejsou k dispozici.

Objekt event, předaný obsluze události, má tyto vlastnosti:

  • targetTouches – seznam objektů Touch pro každý dotyk, který započal ve sledovaném objektu
  • touches – seznam objektů Touch pro každý dotyk na celé ploše zařízení
  • changedTouches – seznam objektů typu Touch pro dotyky, které se účastní události (tj. mění pozici apod.)
  • shiftKey, altKey, metaKey, ctrlKey – u dotykových zařízení vybavených klávesnicí obsahují informace o současně stisknutých klávesách Shift, Alt, Meta a Ctrl.

V události jsou tři seznamy objektů typu Touch. Seznamy jsou implementované jako pole, můžeme tedy zjistit počet prvků pomocí vlastnosti length a přistupovat k prvkům přes indexy (například targetTouches[0] )

Každý objekt typu Touch si můžeme představit jako jednu sledovanou „oblast dotyku“. Jakmile se prst (stylus, …) dotkne plochy, vznikne objekt Touch. V něm je identifikátor dané „oblasti dotyku“ a jeho souřadnice v různých souřadných soustavách. Objekt zůstává po celou dobu, co se prst dotýká povrchu, identifikátor je konstantní a mění se pouze souřadnice (pokud se oblast, tedy „prst“, pohybuje). Jakmile prst ztratí kontakt s povrchem, objekt je zrušen a identifikátor zneplatněn.

Objekt Touch nabízí následující vlastnosti:

  • clientX, clientY – souřadnice bodu dotyku, vztažené k viewportu
  • pageX, pageY – souřadnice bodu dotyku, vztažené k celé stránce
  • screenX, screenY – souřadnice bodu dotyku, vztažené k celé obrazovce
  • identifier – unikátní identifikátor bodu dotyku
  • target – element, pro který byla událost vyvolána
  • force, radiusX, radiusY, rotationAngle – Zatím neimplementované součásti návrhu. Budou umožňovat sledování velikosti oblasti, sílu dotyku a natočení prstu.

Sledováním jednotlivých objektů Touch zjistíme, jak se který prst pohybuje po displeji. Můžeme tak nechat uživatele dělat zcela specifická gesta pro naši aplikaci. Problém ale může nastat s jejich vyhodnocením – to je potřeba udělat celé ve vlastní režii, zde systém nepomůže.

Většina frameworků pro práci s mobilními zařízeními má alespoň základní podporu pro dotykové ovládání; některé ale i velmi propracovanou. Popis těchto frameworků si ale necháme na další díly.

Ukázka

Pozměníme příklad z minulé části. Zůstane pokusný žlutý čtverec, ale namísto gest jej budeme přesouvat jedním prstem po ploše. Kód je opět velmi jednoduchý a přímočarý:

"use strict";

var startX=0, startY=0, lastX=0, lastY=0;

function touchstart(e){
  if(e.touches.length == 1){
     var touch = e.touches[0];
    startX = touch.pageX;
    startY = touch.pageY;
    e.preventDefault();
  }
}

function touchmove(e){
  if(e.touches.length == 1){
     var touch = e.touches[0];
    var node = touch.target;
     node.style.position = "absolute";
    node.style.left = (touch.pageX - startX + lastX) + "px";
    node.style.top = (touch.pageY - startY + lastY) + "px";
    e.preventDefault();
  }
}

function touchend(e){
  if(e.changedTouches.length == 1){
     var touch = e.changedTouches[0];
    lastX = touch.pageX - startX + lastX;
    lastY = touch.pageY - startY + lastY;
    e.preventDefault();
  }
}

function onload(){
  var g = document.getElementById("here");
  g.ontouchmove = touchmove;
  g.ontouchstart = touchstart;
  g.ontouchend = touchend;

} 

Na počátku jsou opět inicializovány globální proměnné, kde se ukládá aktuální souřadnice objektu (lastX, lastY) a souřadnice bodu dotyku. Při dotyku (ontouchstart) si poznamenáme pozici prstu a čekáme na pohyb.

Událost ontouchmove zkontroluje, zda se uživatel dotýká stále jen jedním prstem. Pokud ano, spočítá rozdíl aktuální pozice prstu od jeho počáteční pozice při dotyku, a tento rozdíl přičte k původním souřadnicím.

Při dokončení přesunu si musíme poznamenat, kde objekt skončil. Nemůžeme už  však pracovat s objektem touches (po zvednutí prstu je seznam touches prázdný, protože žádný dotyk neprobíhá), ale changedTouches  – tam je informace o posledním změněném (=zdviženém) prstu.

V pokračování si ukážeme, jak řešit vícedotykové ovládání a jak s dotyky pracují používané mobilní JS knihovny.

Autor děkuje společnosti Czech Computer za laskavé zapůjčení tabletu iPad 2.

Komentáře

Odebírat
Upozornit na
guest
2 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
Zobrazit všechny komentáře
honza
Martin Maly

Dekuji za upozorneni, odkaz jsem odstranil.

Cesta URL: co se děje, než se načte webová stránka

Když do adresního řádku prohlížeče napíšete webovou adresu a stisknete Enter, spustí se fascinující řetězec procesů, které propojují váš počítač s celým světem. Od překladu doménového jména na IP adresu, přes navázání šifrovaného spojení, až po vykreslení každého pixelu na obrazovce - to všechno se odehraje během zlomků sekundy. Pojďme se podívat, co se mezitím děje pod kapotou webu.

Stav SIMD v Rustu v roce 2025

Různé
Komentáře: 1
SIMD - neboli Single Instruction, Multiple Data - znamená, že procesor může jednou instrukcí zpracovat více datových prvků najednou. Typicky to znamená, že místo sčítání dvou čísel přičtete dvě sady čísel paralelně. To může přinést výrazné zrychlení například při zpracování obrazu, audia nebo numerických výpočtů. Pokud již SIMD znáte, tato tabulka je vše, co budete potřebovat. A pokud s SIMD teprve začínáte, tabulku pochopíte do konce tohoto článku