Firemonkey 3D a změna formuláře

vložil Radek Červinka 19. září 2011 01:33

Minule se někdo ptal v komentářích jak se to bude asi dělat v Windows 8 Metro bez modálních formulářů při změně aktuálního formuláře na jiný. Inu zamyslel jsem se a za pomocí jednoho ukázkového příkladu jsem takovou změnu naprogramoval (pravda trošku moc extrémní, ale aspoň to demonstruje možnosti). Přeložené EXE ke stažení pro vyzkoušení!

Jako dvě rozdílné obrazovky jsem si připravil dvě záložky (to není důležité, mohou to být dva docknuté formuláře nebo cokoliv jiného) - to je jen příklad. Na jedné jsou nějaké komponenty a tlačítko pro přepnutí, na druhé zase naopak.

Ale pozor - na formuláři je vložen TLayer3D (něco jako Panel, ale s možností 3D transformace) a teprve na něj je TabControl a záložky.

Jádrem pudla je metoda mSwitchTab.

procedure TForm29.Button2Click(Sender: TObject);
begin
  mSwitchTab(TabItem1);
end;

procedure TForm29.mSwitchTab(newTab: TTabItem);
  procedure mRotate(at:TAnimationType);
  begin
    if ClientWidth > ClientHeight then
      Layer3D1.AnimateFloat('RotationAngle.X', 360, 1.5, at, 
           TInterpolationType.itBack)
    else
      Layer3D1.AnimateFloat('RotationAngle.Y', 360, 1.5, at, 
           TInterpolationType.itBack);
  end;

begin
  mRotate(TAnimationType.atIn);
  Layer3D1.AnimateFloatWait('Position.Z', 500, 1);

  TabControl1.ActiveTab := newTab;

  mRotate(TAnimationType.atOut);
  Layer3D1.AnimateFloatDelay('Position.Z', 0, 1, 1);
end;

procedure TForm29.Button1Click(Sender: TObject);
begin
  mSwitchTab(TabItem2);
end;

Začíná to procedurou mRotate, která provádí rotaci uvedeného Layeru ve 3D buďto v X nebo Y. Rotace je o 360 stupňů a trvá 1.5 sekundy a je asynchronní, tj. začne - ale program v uvedené metodě jede dál. Dalším krokem je animace ve směru Z, tj. (vzdálení nebo přiblížení) - to ale začne probíhat zároveň s rotací, tj. hezky nám obsah Layer3D rotuje a zároveň se zmenšuje což opticky vyvolá dojem vzdalujícího se odlétajícího obsahu.

Ale všimněte si, že je volána metoda AnimateFloatWait místo v předchozím případě AnimateFloat, tj. je to sice interně asynchroní, ale čeká se na dokončení. A právě v okamžiku dokončení přehodím záložku čehož si uživatel nemá šanci všimnout, jelikož si právě dává zpět pokleslou čelist, resp. jde si pro prášek na bolení hlavy.

No a následně si zarotujeme ještě jednou (již s novou záložkou) a s přiblížením. V druhém případě je to úplně stejné, jen s jinou záložkou.

Uznávám je to extrém a bohatě by stačilo odsunutí nebo jedno otočení (případně překrytí), ale jedná se o ukázku, kterou si můžete stáhnout se zdrojovými kódy a exe pro Win32: FireMonkey 3D animace (1.5M, ZIP).

Jen poslední poznámka: během animace lze dál provádět operace (i od uživatele) - je to "asynchronní".

Připomínám, že na Windows Vista (asi se service packem) nebo Windows 7 to poběží v DirectX módu, jinde v GDI+ módu. TLayer3D potřebuje moderní grafickou kartu (většinou stačí cokoliv novějšího roku 2003).

Tagy: ,

FireMonkey

Komentáře

19.9.2011 7:48:23 #

Vladimír klaus

Soubor ke stažení není dostupný...

Vladimír klaus

19.9.2011 8:28:17 #

Radek

Odkaz ke stazeni je zda se spatne.

Radek

19.9.2011 9:39:15 #

Leoš

V odkazu je chyba, změňte si příponu v odkazu ze 7Z na ZIP a stáhnete to..

Nicméně k ne-dialogům. V Silverlightu (webové WPF), kde klasické dialogy také nejsou, se to řeší tak, že se otevírá jakási další vrstva přes celou aplikaci (pozadí se zatmaví a klikání na ně se zakáže) a zobrazí se panel s obsahem vepředu. Uživatel vybere volbu a vše se zase vrátí do normálu. Z hlediska uživatele je princip prakticky totožný s normálním dialogem (až na vzhled a omezení na plochu okna). Spíš to půjde touto cestou - pochybuji, že firemní aplikace se budou vyžívat v nějakých zajížděcích, rotujících, zvětšovacích oknech.

Leoš

19.9.2011 10:04:30 #

Radekc

Omlouvám se za odkaz, opraveno.

Ad dialogům: říkal jsem že je to příklad jako demonstrace možností. To co píše Leoš je jednodušší varianta. Hold já jsem z iPhone navyklý na takové různé efekty, takže jsem chtěl ukázat že to nebude problém ani s FireMonkey.

Lepší ukázat komplikovanější efekt :-)

Radekc

19.9.2011 10:13:44 #

<z>

vypada to, ze bude prset :)

hezke je to, nektere veci (to rotujici kolecko) opravdu ve VCL standardne chybi,
na druhou stranu - 30% vytizeni procesoru a 60MB v pameti - zlate VCL :D

<z>

19.9.2011 10:17:40 #

Radekc

Windows 7, grafika Intel (tj. v podstatě hrůza), vytížení procesoru 5% na stránce s kolečkem, 0% na druhe strance. Paměť cca 25M.

Co máš za OS?

Radekc

19.9.2011 12:46:15 #

PS

Asi takto: Vista 32bit 1920x1200 (core2duo) ati 3470 30-40% cpu otáčajúca sa animácia na prvom tabe. Prekreslovanie hover efektu Buttonu a Tabov hore nestíha (zmenšenie na design veľkosť rieši problém s lagom GUI, a záťaž klesne pod 15percent). Čo mi je záhodou nakoľko embt na fóre tvrdilo, že sa prekreslujú len nevyhnutné časti obrazovky. Čo ale asi v 3D móde neplatí (tam by to asi nemalo žiadny efekt na výkon).

Písmo je samozrejme vykreslované čínskym rendererom (Direct2D), ktorý nerešpektuje nastavenia cleartype. Rovnako sa správa Firefox s HW akceleráciou. Všetko sa to samozrejme mení použitým ovládačom grafickej karty ...
Plus okno pred touto FM aplikáciou dostane lagy pri presúvaní.

PS

19.9.2011 12:59:36 #

Radekc

>hover efektu Buttonu a Tabov hore nestíha

Dá se programově globálně zakázat nastavením jedné proměnné.

Radekc

19.9.2011 13:06:12 #

Radekc

Jinak Direct2D se dá potlačit a renderovat text přes GDI+.

Radekc

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců