Google+ Followers

čtvrtek 23. června 2016

Knihovna FireMonkey

Přesto, že vývoji aplikací pro mobilní platformy jsem se již v některých příspěvcích věnoval, nebyl vysvětlen význam knihovny FireMonkey (někdy také označované zkratkami FMX nebo FM).

Co je FireMonkey


FireMonkey je aplikační platforma (knihovna komponent), kterou společnost Embarcadero poprvé přidalo do svých nástrojů ve verzi XE2. Jedná se o alternativu k populární VCL, která je určena výhradně pro rychlý vývoj aplikací pro Windows a je tak v mnoha ohledech závislá na službách poskytovaných operačním systémem.

Hlavním důvodem pro rozšíření vývojových nástrojů o knihovnu FireMonkey byla právě snaha nabídnout vývojářům možnost vyvíjet aplikace pro různá zařízení a různé operační systémy. Knihovna FireMonkey je napsána v přímo v jazyce Objec Pascal a pro přístup k hardware jsou používány knihovny cílového operačního systému. U Windows jde o GDI+/Direct2D, na Mac OS X je to OpenGL a na iOS pak OpenGL_ES. Většina vizuálních objektů knihovny je založena na přístupu "CustomDraw", který řeší jejich vykreslování na úrovni hardwaru. Přes instanci "Platform", která tvoří můstek mezi FireMonkey a zvoleným OS je pak realizována například práce s okny, myší nebo vybranými nativními ovládacími prvky. Přibližně 80 - 90% kódu je tak nezávislá na hostitelském operačním systému.

Aby použití vlastních prvků uživatelského rozhraní nemělo nepříznivý dopad na rychlost běhu výsledných aplikací, využívá FireMonkey v maximální možné míře výkonu grafických procesorů. Všechny operace pracující s grafikou běží na samostatném vláknu a výkon CPU je tak k dispozici pro zpracování aplikační logiky. Zapojení GPU kromě rychlosti přináší i přístup k řadě grafických funkcí, které lze využít k návrhu poutavějších a uživatelsky přívětivějších aplikací.

Knihovny FireMonkey a VCL (Visual Component Library) nejsou vzájemně kompatibilní a nelze je kombinovat v rámci jednoho modulu. Příčinou jsou některé rozdíly v jejich vnitřní implementaci.

Podporované platformy
Aplikace vytvořené za pomoci FireMonkey lze přeložit do nativního tvaru pro operační systémy:

  • Windows 32-bit (Intel)
  • Windows 64-bit (Intel)
  • Mac OS X (Intel)
  • iOS (ARM) + iOS Simulátor (Intel)
  • Android (ARM) + Android Emulator
  • Android (Intel, s využitím libhoudini)

Hlavní rozdíly mezi FMX a VCL

Použití vektorové grafiky


Knihovna VCL využívá rastrovou (bitovou, bitmapovou) grafiku, která je založena na popisu vlastností jednotlivých bodů, neboli pixelů. Ve FireMonkey je naopak většina vizuálních objektů "složena" z takzvaných primitivních grafických tvarů vektorové grafiky, jako je například obdélník, oblouk, kruh a další. Protože vektorová grafika na matematickém popisu grafických prvků, umožňuje bezproblémovou změnu měřítka, což je v době, kdy trh nabízí nekonečnou kombinaci velikostí a rozlišení zobrazovacích zařízení důležitá přednost.

Rastrová grafika

Rozměry, umístění prvků


Pokud v knihovně VCL nastavujeme šířku, výšku nebo například vzdálenost od okraje formuláře, musíme použít datový typ Integer. V opačném případě obdržíme chybové hlášení.

VCL - Chybové hlášení

FireMonkey v tomto případě těží z použití vektorové grafiky. Nejen, že umožňuje použití datového typu Float, ale místo pevné hodnoty lze použít takzvané animace (v inspektorovi objektů jsou označeny ikonkou okénka filmového pásu).

Zadávání rozměrů ve FireMonkey

Kódování barev


FireMonkey je určeno pro vytváření grafických aplikací. Zásadní je proto co nejširší podpora pro práci s barvami. Zásadním rozdílem v používání barev ve FireMonkey je využívání takzvaného "Alfa kanálu", neboli průhlednosti.

Rozdíly v kódování barev VCL a FireMonkey

Všechny parametry přístupné během návrhu lze samozřejmě nastavit i prostřednictvím kódu. Zde je třeba zohlednit rozdíly mezi knihovnami VCL a FireMonkey. Ty se týkají především již zmiňovaného kódování barev a jiného pojmenování barevných konstant.


Delphi


Knihovna VCL
Knihovna FMX

uses
  VCL.Graphics

var
  barva: TColor;

barva := clRed;
barva := 255;
barva := rgb(255, 0, 0);
barva := $0000FF;
uses
  System.UIConsts

var
  barva: TAlphaColor;

barva := claRed;
barva := $00FF0000;
barva := TAlphaColorRec.Red;
barva := TAlphaColors.Red;



C++Builder


Knihovna VCL
Knihovna FMX
#include <System.UIConsts.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TColor b;
  barva = clRed;
  barva = 255;
  barva = rgb(255, 0, 0);
  barva = $0000FF;
}


#include <System.UIConsts.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TAlphaColor b;
  barva = claRed;
  barva = System::Uiconsts::claRed;
  barva = TAlphaColors::Red;
  barva = 536870911;
}

Použití fontů


Ve VCL se velikost fontu určuje v bodech. Na palec připadá 72 bodů. Ve FireMonkey jsou velikosti fontů uváděny v DIP (Device Independent Pixel). Na palec připadá 96 pixelů. Při stejné velikosti písma tak bude text ve FireMonkey drobnější.

Porvnání velikosti fontů

Vztah předek rodič


VCL omezuje možnost nastavit objekt jako vlastníka pouze pro kontejnery jako jsou komponenty tříd "TForm", "TFrame", "TPanel" nebo "TDataModule". FireMonkey je v tomto směru mnohem otevřenější a prakticky kterýkoliv objekt může být vlastníkem libovolného jiného objektu. Implementace je možná nejen z kódu, ale často i vizuálně za pomoci okna "Structure Window":

Okno "Structure Window"