Obsah. LayoutInflater. UI model KeyEvent View Tvorba vlastních komponent Canvas Matrix Vlastní EditText

Podobné dokumenty
Uživatelské rozhraní. Layouty FrameLayout LinearLayout RelativeLayout TableLayout ScrollView Taby Dialogy ViewFlipper 11/29/11

(c) Miroslav Balík, Ondřej Kroupa, Martin Pelant 11/29/ přednáška. Android projekt. Manifest. Activity. Uživatelské rozhraní (základy)

Začínáme s vývojem pro Android

4. UŽIVATELSKÉ ROZHRANÍ

Obsah. Menu. ListView ListActivity Adapter. Ikonkové Rozšířené Submenu Kontextové. BaseAdapter ArrayAdapter CursorAdapter SimpleCursorAdapter 11/29/11

KMI / TMA Tvorba mobilních aplikací. 3. seminář ZS 2016/2017 Středa 13:15-15:45

Java - Kresba. 2/28/11 1/8 Java - kresba

Android OpenGL. Animace a ovládání pomocí dotykové obrazovky

KAPITOLA 7. Widgety nabídek. V této kapitole:

KMI / TMA. Tvorba mobilních aplikací. 3. seminář ZS 2017/2018 ČTVRTEK 13:15-15:45

Projekt Obrázek strana 135

Java aplety. Předávání parametrů z HTML

Java a XML. 10/26/09 1/7 Java a XML

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

1. Téma 12 - Textové soubory a výjimky

20. Projekt Domácí mediotéka

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah. Životní cyklus activity Context Intent Spouštění aktivit Interakce s uživatelem. Toast. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant

Úvod do programovacích jazyků (Java)

2 Grafický výstup s využitím knihovny

Programování v C++ 3, 3. cvičení

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Teoretické minimum z PJV

11/29/11. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant. 11. Přednáška. Broadcast receiver Timer Alarmy Widgety

KMI / TMA Tvorba mobilních aplikací. 9. seminář ZS 2016/2017 Středa 13:15-15:45

Programování v Javě I. Únor 2009

Jazyk C# (seminář 3)

První kapitola úvod do problematiky

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Obrázek. Základní popis, zadání úkolu. Struktura tříd,

Programování v Javě I. Leden 2008

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

Principy objektově orientovaného programování

3. ŽIVOTNÍ CYKLUS ACTIVITY

1. Dědičnost a polymorfismus

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

Programování v C++ 2, 4. cvičení

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Obsah. Úvod 11. Vytvoření emulátoru 20 Vytvoření emulátoru platformy Android 4.4 Wearable 22 Spouštění aplikací na reálném zařízení 23

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

8 Třídy, objekty, metody, předávání argumentů metod

Generické programování

Zpřístupnění mobilních telefonů se systémem Android pro nevidomé uživatele

Android OpenGL. Pokročilé shadery

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

JAVA Android Java, letní semestr

Více o konstruktorech a destruktorech

UJO Framework. revoluční architektura beans. verze

11/29/11. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant. 12. Přednáška. Zjišťování polohy Google Mapy OverlayItem Zálohování.

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Programování v C++ 1, 6. cvičení

Abstraktní třída a rozhraní

Příklad zobrazení toastu s vlastním designem

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Konstruktory a destruktory

MRBT. Stacionární průmyslový robot EPSON C3 aplikace pro prezentaci

Výčtový typ strana 67

GUI. JavaFX. Java UI, letní semestr 2017/2018 1

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

Java GUI události. Událostmi řízené programování. Zpracování = obsluha událostí

Programování v C++ 1, 5. cvičení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

JSR tutorial 2 Transformace v JSR-184

2 Tvorba interaktivních grafických programů

ZP4CS 10. hodina Kreslení deskové hry. Aleš Keprt duben 2015

Jazyk C# (seminář 6)

Cvičení 7: Delphi objekty CheckedBox, Radio- Button, EditBox

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

Semestrální práce 2 znakový strom

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Chain of responsibility

Code Contracts. Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

Dědičnost (inheritance)

Obsah. October 2, Polymorfizmus. Typologie testování. Problém polymorfizmu. Vady/Anomálie. Vazební sekvence ČVUT FEL, K13132

Chování konstruktorů a destruktorů při dědění

Abstraktní datové typy

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

KTE / ZPE Informační technologie

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

15. Projekt Kalkulačka

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Transkript:

Obsah UI model KeyEvent View Tvorba vlastních komponent Canvas Matrix Vlastní EditText LayoutInflater Dotykové události MotionEvent Dynamické přidání View 2

UI model Androida View Základní stavební kámen pro UI komponenty Základem pro Widgety - interaktivní komponenty Obdélníková oblast Zodpovědná za vykreslování a zpracování událostí Viewgroup Speciální View Může obsahovat potomky (children) Základem pro layouty a view kontejnery 3

Přehled Základní widgety Button TextView EditText ListView CheckBox RadioButton Spinner Základní layouty LinearLayout FrameLayout RelativeLayout 4

Pokročilejší widgety AutoCompleteTextView Podobá se spíš EditTextu než TextView Navrhuje text v průběhu psaní Gallery Zobrazuje obrázky (centrovaně) v horizontálním seznamu ImageSwitcher Plynulá výměna obrázků TextSwitcher Při zavolání settext(charsequence) dojde k animaci 5

KeyEvent Událost kláves a tlačítek Mají definovovaný tzv.,,key code Integer konstanta Např. KeyEvent.KEYCODE_VOLUME_UP KeyEvent.KEYCODE_W KeyEvent.KEYCODE_DPAD_CENTER KeyEvent.KEYCODE_ENTER Každý stisk se skládá ze sekvence KeyEventů Začíná KeyEvent.ACTION_DOWN Končí KeyEvent.ACTION_UP 6

7 Základní metody View Konstruktory 1. Volán při vytvoření z kódu 2. Volán při vytvořená z XML layoutu Měl by zpracovávat všechny možné atributy z XML onfinishinflate() Závoláno poté, co View bylo načteno z XML layoutu onmeasure(int, int) Změří View včetně obsahu Je nezbytné nastavit šířku a výšku setmeasureddimension(int, int) Jinak IllegalStateException onlayout(boolean, int, int, int, int) Zavoláno v případě, kdy je třeba sdělit šířku a výšku potomkovi layoutu onsizechanged(int, int, int, int) Zavoláno v případě změny velikosti View

8 Základní metody View pokračování ondraw(canvas) Zavoláno v případě, kdy se má View vykreslit Zde se provádí samotné vykreslení obsahu View na Canvas invalidate() Manuálně provede překreslení (zavolá se ondraw()) onkeydown(int, KeyEvent) Zavoláno po KeyEvent.ACTION_DOWN onkeyup(int, KeyEvent) Zavoláno po KeyEvent.ACTION_UP ontrackballevent(motionevent) Zavoláno při pohybu trackballem ontouchevent(motionevent) Zavoláno při pohybu ukazatelem na obrazovce

9 Základní metody View pokračování onfocuschanged(boolean, int, Rect) Zavoláno při změně fokusu onwindowfocuschanged(boolean) Zavoláno v případě, kdy okno obsahující View získá nebo ztratí fokus onattachedtowindow() Zavoláno v případě připojení View do okna ondetachedfromwindow() Zavoláno v případě odpojení View z okna onwindowvisibilitychanged(int) Zavoláno v případě změny viditelnosti okna, které obsahuje View

10 Tvorba vlastních komponent Důvody Tvorba kompletně nové komponenty Např. ukazatel aktuální stránky v průvodci (ViewFlipperu) Úprava již existujících View Vzhled Změna písma (pozn.: font nelze nastavovat widgetu v XML, pouze programově) Funkčnost Úprava či vytvoření nových událostí Vytvoření jedné komponenty z více View např. vlastní ComboBox Vždy se dědí od nějakého View

11 Canvas Třída pro kreslení na plátno Lze malovat např. Obdélník drawrect(rect, Paint) Bod drawpoint(x, y, Paint) Cestu drawpath(path, Paint) Bitmapu drawbitmap(bitmap, Matrix, Paint) Úsečku drawline(startx, starty, stopx, stopy, Paint) Text drawtext(text, x, y, Paint) Vyplnění Canvasu barvou drawcolor(color) třída Paint definuje styl (barva, tloušťka, výplň ) pro daný objekt, který se do Canvasu kreslí setmatrix(matrix) nastavení matice transformace pro budoucí kreslení

12 Matrix Slouží k transformaci objektu Obsahuje matici 3x3 setscale setskew settranslate setrotate postscale posttranslate postrotate Hodnoty pole, které nastaví getvalues(float[] values) 0 : Měřítko X 1 : Zkosení X 2 : Transformace X 3 : Měřítko Y 4 : Zkosení Y 5 : Transformace Y 6 : Perspektiva 7 : Perspektiva 8 : Perspektiva 0 1 2

13 Vlastní EditText s podtrháváním řádků příklad class LinedEditText extends EditText { private Rect mrect; private Paint mpaint; public LinedEditText(Context context, AttributeSet attrs) { super(context, attrs); mrect = new Rect(); mpaint = new Paint(); mpaint.setstyle(paint.style.stroke); mpaint.setcolor(0x800000ff); } @Override protected void ondraw(canvas canvas) { int count = getlinecount(); Rect r = mrect; Paint paint = mpaint; for (int i = 0; i < count; i++) { int baseline = getlinebounds(i, r); canvas.drawline(r.left, baseline + 1, r.right, baseline + 1, paint); } super.ondraw(canvas); }}

14 Použití vlastní komponenty v XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearlayout1" android:layout_width="fill_parent" android:layout_height="fill_parent"> <cz.cvut.fit.example.linededittext android:text="linededittext" android:id="@+id/linededittext1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" android:padding="5dp" android:scrollbars="vertical" android:fadingedge="vertical" android:gravity="top" android:textsize="22sp" android:capitalize="sentences" /> </LinearLayout>

15 Výsledek EditTextu s podtrháváním

16 LayoutInflater Umožňuje naplnit objekt View obsahem z XML Instanci získáme pomocí LayoutInflater.from(context); Naplňené View získáme pomocí těchto metod: inflate(int resource, ViewGroup root); Vrátí View Pokud root není null, automaticky do něj přidá dané View inflate (XmlPullParser parser, ViewGroup root) 1. LayoutInflater li = LayoutInflater.from(this); 2. LinearLayout ll=(linearlayout) li.inflate(r.layout.main, null);

17 Dotykové události Přepsáním ontouchevent(motionevent event)ve View můžeme reagovat na dotykové události Alternativa implementace ontouchlisteneru a nastavení ho View view.setontouchlistener(ontouchlistener); MotionEvent poskytuje všechny potřebné informace dané události

18 MotionEvent getaction() Vrátí ID akce, kterou uživatel provedl MotionEvent.ACTION_DOWN Uživatel se dotkl obrazovky MotionEvent.ACTION_UP Uživatel se přestal dotýkat obrazovky MotionEvent.ACTION_MOVE Uživatel provedl pohyb na dotekové obrazovce (mezi ACTION_DOWN a ACTION_UP) MotionEvent.ACTION_CANCEL Gesto bylo zrušeno MotionEvent.ACTION_OUTSIDE Uživatel provedl dotyk mimo aktuální View Pomocí event.getx() a event.gety() můžeme získat aktuální souřadnice doteku

19 MotionEvent getactionmasked() Vrátí profiltrované ID bez bitu označujícího index doteku Alternativa k event.getaction() & MotionEvent.ACTION_MASK; Kromě hodnot z předešlého slajdu může vrátit: MotionEvent.ACTION_POINTER_DOWN Uživatel provedl paralelní dotyk (multitouch) MotionEvent.ACTION_POINTER_UP Uživatel se přestal jedním ukazatelem dotýkat Pomocí event.getactionindex() můžeme získat index doteku k aktuální akci Pomocí event.getx(index) a event.gety(index) můžeme získat aktuální souřadnice daného doteku

20 Posouvání obrázku ukázka 1. public class MyCustomImageView extends ImageView { 2. private float lastmotionx; 3. private float lastmotiony; 4. private Matrix matrix = new Matrix(); 5. @Override 6. public boolean ontouchevent(motionevent event) { 7. switch (event.getaction()) { 8. case MotionEvent.ACTION_DOWN: //uzivatel se zacal dotykat View 9. lastmotionx = event.getx(); 10. lastmotiony = event.gety(); 11. break; 12. case MotionEvent.ACTION_MOVE: //uzivatel provedl pohyb 13. int deltax = (int) (event.getx() - lastmotionx); 14. int deltay = (int) (event.gety() - lastmotiony); 15. 16. //nastavime transformaci a posuneme obrazek 17. matrix.posttranslate(deltax, deltay); 18. setimagematrix(matrix); 19. 20. lastmotionx = event.getx(); 21. lastmotiony = event.gety(); 22. } 23. return true; 24. } 25....

21 Dynamické přidání View Pokud potřebujeme dynamicky přidat nějaké View do ViewGroup, použijeme metodu viewgroup.addview(view) popř. viewgroup.addview(view, position) 1. 2. 3. 4. TextView tw=new TextView(this); tw.settext("text"); LinearLayout layout = (LinearLayout) findviewbyid(r.id.layout); layout.addview(tw, 0); View může mít maximálně jednoho rodiče Pokud je View již v nějakém layoutu a pokusíme se ho přidat do jiného layoutu, systém vyhodí IllegalStateException

Dynamické odebrání View Pro odebrání View z ViewGroup slouží tyto metody: viewgroup.removeviewat(index); viewgroup.removeview(view); viewgroup.removeviews(start, count); viewgroup.removeallviews(); 22