Autor Téma: Kapacitní dotykový displej se chová podivně u tlačítka TSpeedButton  (Přečteno 997 krát)

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Na stackoverflow stránce píše jeden uživatel, že to vyřešil takto:

It turns out that the MouseDown events were sent but the Pressed property of TControl in FMX returns false even if you are touching the screen. The Pressed property reads only the mouse buttons down. After implementing myPressed property by MouseDown and MouseUp, myPressed was returning true even if you touch the screen and then remove the touch.

Rozumíte někdo tomu, co udělal?

Díky.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2697
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
OnTap trpí stejnými problémy:

1) když se provede prstem klik a hned uvolní, tak přijde před Down eventem
2) když se provede prstem klik a neuvolní, tak OnTap event nepřijde nikdy, ani po pohybu prstem nebo uvolnění

Asi to už někdo řešil zde: https://stackoverflow.com/questions/50465050/start-touch-and-finish-touch-event-delphi


Ale to spravne chovani, lehky stisk (Tap) se zavola aby jsi na to mohl reagovat, treba provest skrolovani bez toho aby se provedl vyber.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2914
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
It turns out that the MouseDown events were sent but the Pressed property of TControl in FMX returns false even if you are touching the screen. The Pressed property reads only the mouse buttons down. After implementing myPressed property by MouseDown and MouseUp, myPressed was returning true even if you touch the screen and then remove the touch.
Jo. Chtel pouzit TControl.Pressed a nefungovalo mu to. Nakonec prisel na to, ze se mu MouseDown objevi, ale hodnota Pressed tomu neodpovida, tak is udelal vlastni Pressed (MyPressed) a jeho hodnotu odvodil od MouseDown/Up.

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Ale to spravne chovani, lehky stisk (Tap) se zavola aby jsi na to mohl reagovat, treba provest skrolovani bez toho aby se provedl vyber.

Dobře. Tak co mám dělat, když chci zachytit nějakou libovolnou událost na stisk prstem bez následného pohybu a uvolnění. Prostě jen stisku a budu držet prst hodinu na tlačítku. Jakou událostí mám toto zachytiti, když žádná z diskutovaných nepřijde?


Jo. Chtel pouzit TControl.Pressed a nefungovalo mu to. Nakonec prisel na to, ze se mu MouseDown objevi, ale hodnota Pressed tomu neodpovida, tak is udelal vlastni Pressed (MyPressed) a jeho hodnotu odvodil od MouseDown/Up.

Tak to mě MouseDown event nechodí, resp. po stisku prstu bez uvolnění nepřijde nic. :(

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2914
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Tak to mě MouseDown event nechodí, resp. po stisku prstu bez uvolnění nepřijde nic. :(
Tak to mas blby...

Zkus se podivat na ten zminovany TGestureManager a ev. si dat bkpt/trasovat zdrojovky pri zapnutem Debug DCU.
Ja o tom nic nevim, ani nic vedet nechci :-)

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Pro lepší debug jsem si kód z komponenty vložil přímo do zdrojáku. Nenašel jsem nic, jak zachytit obyčejný stisk prstem (bez pohybu a nechat stisknutý) na kapacitní dotykové obrazovce.

Po vyřešení tohoto problému pak bude zbývat ještě vyřešit proč tlačítko neproblikne, respektive problikne jen někdy.

Vše to ale souvisí s kapacitní dotykovou vrstvou, tj. která umožňuje gesta.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2697
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Pro lepší debug jsem si kód z komponenty vložil přímo do zdrojáku. Nenašel jsem nic, jak zachytit obyčejný stisk prstem (bez pohybu a nechat stisknutý) na kapacitní dotykové obrazovce.

Po vyřešení tohoto problému pak bude zbývat ještě vyřešit proč tlačítko neproblikne, respektive problikne jen někdy.

Vše to ale souvisí s kapacitní dotykovou vrstvou, tj. která umožňuje gesta.

A zavola se ti OnTap? V tom pripade na OnTap dej stejnou udalost jako na OnClick.
Embarcadero MVP - Czech republic

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Ne OnTap v tomto případě NIKDY nepřijde. Ani po uvolnění prstu.

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
A to se mi ještě povede udělat rychlý klik prstem (mouse down + click event) bez up eventu.

Prostě v Delphi je něco špatně co neumí správně obsluhovat multitouch displeje. 

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Tak po přidání AutoCapture := true; do komponenty tlačítka zmizel problém s chybějícím MouseUp eventem, který nastal občas při rychlém stisku s potažením prstu. Od té doby se mi to nepodařilo zopakovat.

Zbývá chybějící MouseDown event, který nikdy nepřijde v momentě, když se stiskne prstem dotyková obrazovka. Napadlo mě nějak zachytit message s dotykem, zjistit komponentu pod prstem a poslat ji MouseDown signál. To samé pak i s MouseUp. U Windows bych použil WindowsMessage. U FMX to musím vygooglovat...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2914
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
A dival ses, jak mas nastavena napr. standard gestures (http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Types.TStandardGestures) aj. v TouchManageru ev. GestureManageru?

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Gesta, tj. GestureManager nepoužívám. Pokud vím, tak gesta přicházejí až po jejich dokončení a to by bylo stejně pozdě - navíc se mi nikdy nepodařilo je rozběhat.

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Asi jsem přišel na způsob, jak problém s Mouse eventy na touch displeji vyřešit. Hlavní formulář má event OnTouch, který registruje i to první stisknutí. Takže na tuto Touch akci Down a Up zavolám v tlačítku, ležící v místě pod kurzorem (využívám ObjectAtPoint), patřičnou obsluhu. Zatím to vypadá dobře, akorát musím předělat samotné tlačítko tak, aby nedocházelo např. k dvojitému zavolání stisku a podobně.


Kdo by řekl, že obyčejný stisk na touch displeji vyvolá tolik komplikací. Pak mi nikdo nechce veřit, s čím vším se u Firemonkey setkávám :(
« Poslední změna: 19-05-2020, 15:05:16 od age.new »

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 11
    • Verze Delphi: Delphi 10.2
Klasické aplikace windows se chovají normálně? Když uděláš VCL aplikaci, tak se to chová stejně blbě jako FMX? Když jsem si hrál s FMX na androidu, tak jsem vysledoval, že se to chovalo jinak na různejch verzích Androidu, speciálně na Samsung telefonech. Stisknutí tlačítka bez efektů, tlačítko zůstávalo jakoby stisknutý...
Jestli jsem si dobře všimnul, používáš Berlin, kterej není úplně novej, zkus se s někým domluvit kdo má poslední verzi (třeba Radek) aby ti přeložil nějaký demo a otestovat jestli se v nový verzi to chování nezměnilo.

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 217
  • Karma: 0
Tak příčina není v Delphi ale typu displeje. Po komunikaci s výrobcem nám byl zaslán spec. driver, který z multi-touch displeje udělal pouze single-touch a v tu chvíli vše fungovalo jak má. Klikání prstem se pak chová 100% jako u myši a asi je to i reakčně rychlejší  (možná jen můj pocit).

Pokud i tak někdo bude potřebovat zprovoznit správné posílání eventů i u multi-touch displeje, tak cesta přes Form.OnTouch je funkční. Akorát se musí ošetřit zamezení dvojitého vyvolání MouseDown eventů a případě i vyvolání MouseDown eventu na dvou různých tlačítek blízko sebe.