56
8. Java 2D a kreslení Ondřej Brejla

Java 2D a kreslení

Embed Size (px)

Citation preview

Page 1: Java 2D a kreslení

8. Java 2D a kresleníOndřej Brejla

Page 2: Java 2D a kreslení

Obsah

Grafický kontext Volba barvy Volba písma Fontové metriky Kreslení primitivních objektů Kreslení obrázků Rozhraní – Shape, Paint, Stroke, Composite

Transformace Kreslení polygonů a obecných křivek

Page 3: Java 2D a kreslení

Co je to ”grafický kontext”?

Page 4: Java 2D a kreslení

Co je to ”grafický kontext”?

Page 5: Java 2D a kreslení

Co je to ”grafický kontext”?

Krysa je v grafickém kontextu dělící čáry.

Page 6: Java 2D a kreslení

Grafický kontext

Co to znamená ”grafický kontext”? Je to datová struktura ”Abstraktní kreslítko” - jak a kam VS. co Je to objekt třídy Graphics (resp. Graphics2D) Definuje metody pro kreslení a výstup textu Pro kreslení do komponent většinou překrýváme

metodu:

public void paintComponent(Graphics g)

Page 7: Java 2D a kreslení

Jak mohu zvolit barvu?

Page 8: Java 2D a kreslení

Jak mohu zvolit barvu?

Page 9: Java 2D a kreslení

Jak mohu zvolit barvu?

Namočíme štětec do kalíšku...

...nebo...

Page 10: Java 2D a kreslení

Jak mohu zvolit barvu?

...nebo...

...použijeme třídu

java.awt.Color

Page 11: Java 2D a kreslení

Jak mohu zvolit barvu?

Color.GREEN

Color.YELLOW

Color.BLUE

Color.ORANGE

Color.WHITE

Color.RED

Page 12: Java 2D a kreslení

Volba barvy

Před kreslením je barvu třeba nastavit g.setColor(Color color); // getColor();

Použijeme objekt java.awt.Color Buď předdefinovanou konstantu (např. Color.RED) Nebo vlastní instanci new Color(int red, int green, int blue);

red, green, blue - <0; 255>

Page 13: Java 2D a kreslení

Jaké písmo vybrat?

Page 14: Java 2D a kreslení

Jaké písmo vybrat?

Aš nazg durbatulűk...

Page 15: Java 2D a kreslení

Jaké písmo vybrat?

Tak jednoduché to nebude...

Page 16: Java 2D a kreslení

Volba písma

Před použitím je potřeba písmo nastavitg.setFont(Font font); // g.getFont();

Písmo je reprezentováno objektem třídyjava.awt.Font

Konstruktor má 3 parametry – name, style, size name – logické (Serif, Monospaced,

SansSerif, Dialog a DialogInput), nebo ”fyzické”

style – Font.PLAIN | BOLD | ITALIC size – velikost v bodech – 1 bod = 1/72”

Objekt písma nelze později upravovat

Page 17: Java 2D a kreslení

Jaké jsou fontové metriky?

Page 18: Java 2D a kreslení

Jaké jsou fontové metriky?

Page 19: Java 2D a kreslení

Jaké jsou fontové metriky?

Je jich spousty...vypadá to zmateně...

Page 20: Java 2D a kreslení

Jaké jsou fontové metriky?

...nás, naštěstí, zajímá pouze jedna...

Page 21: Java 2D a kreslení

Jaké jsou fontové metriky?

...a to tato jednoduchá...uff.

Page 22: Java 2D a kreslení

Fontové metriky

Fontové metriky získáme z objektu třídy java.awt.FontMetrics

public int getAscent() - výška znaku nad účařím v pixelech

public int getDescent() - výška znaku pod účařím v pixelech

public int getLeading() - velikost mezery mezi řádky v pixelech

public int getHeight() - velikost písma v pixelech

Page 23: Java 2D a kreslení

Fontové metriky

A objekt FontMetrics získáme z grafického kontextu g.getFontMetrics() - metrika aktuálního fontu g.getFontMetrics(Font font) – metrika

zadaného fontu

Page 24: Java 2D a kreslení

Jak kreslit primitivní objekty?

Page 25: Java 2D a kreslení

Jak kreslit primitivní objekty?

Page 26: Java 2D a kreslení

Jak kreslit primitivní objekty?

Třeba jako Picasso (Guernica)...

...nebo...

Page 27: Java 2D a kreslení

Jak kreslit primitivní objekty?

...nebo...

...použijeme metody třídy

java.awt.Graphics

Page 28: Java 2D a kreslení

Kreslení primitivních objektů

g.drawLine(int x1, int y1, int x2, int y2) – vykreslí čáru mezi body

g.drawRect(int x, int y, int width, int 

height) – vykreslí obrys obdélníka (od souřadnic levého horního rohu)

g.fillRect(int x, int y, int width, int 

height) – vyplní obdélník (-||-)

g.drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) - vykreslí obrys obdélníka se zaoblenými rohy (-||-)

g.fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) – vyplní obdélník se zaoblenými rohy (-||-)

Page 29: Java 2D a kreslení

Kreslení primitivních objektů

g.draw3DRect(int x, int y, int width, int height, boolean b) – vykreslí obrys 3D obdélníka, b == true => vystouplý, b == false => zapuštěný ( -||- )

g.fill3DRect(int x, int y, int width, int height, boolean b) – vyplní 3D obdélník (parametry stejné jako u draw)

g.drawOval(int x, int y, int width, int height) – vykreslí obrys elipsy, parametry popisují obalový obdélník (elipsa se všech stran dotýká)

g.fillOval(int x, int y, int width, int height) – vyplní elipsu (parametry stejné jako u draw)

Page 30: Java 2D a kreslení

Kreslení primitivních objektů

Oblouk je určen počátečním úhlem a velikostí vnitřního úhlu ve stupních

počáteční úhel je na ”3 hodinách” Proti směru hodinových ručiček je úhel kladný

g.drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) – vykreslí obrys oblouku relativně k zadané elipse

g.fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) – vyplní oblouk relativně k zadané elipse

g.drawString(String s, int x, int y) – vykreslí řetězec (souřadnice účaří nejlevějšího znaku)

Page 31: Java 2D a kreslení

Jak kreslit obrázky?

Page 32: Java 2D a kreslení

Jak kreslit obrázky?

Page 33: Java 2D a kreslení

Jak kreslit obrázky?

Ručně kreslit radši nebudeme...

Page 34: Java 2D a kreslení

Jak kreslit obrázky?

...radši obrázek načteme a necháme vykreslit

Page 35: Java 2D a kreslení

Kreslení obrázků

Rozhraní Icon

Obrázek pevné velikosti používaný pro dekorace Nelze provádět úpravy obrázku Lze vykreslit na komponentu metodou g.paintIcon()

Abstraktní třída Image reprezentuje obrázek

VolatileImage – data nejsou přímo dostupná z Javy

BufferedImage – obsahuje pole pixelů dostupných z Javy, lze do něj kreslit

Page 36: Java 2D a kreslení

Kreslení obrázků

ImageIcon Ikona na základě obrázku Lze použít Image tam, kde je vyžadováno Icon

Konstruktor bere název souboru – URL (gif, png, jpg)

Page 37: Java 2D a kreslení

Kreslení obrázků

Načtení obrázku Image je abstraktní, takže musíme jinak Pomocí třídy Toolkit Toolkit.getDefaultToolkit().createImage(file);

Kreslení obrázků

g.drawImage() - image, levý horní roh a velikost Kreslení obrázku je asynchronní

Pokud nejsou k dispozici kompletní data, informuje komponentu přes rozhranní ImageObserver, jakmile se další data objeví

Metoda umí vykreslit i výřez

Page 38: Java 2D a kreslení

Graphics vs. Graphics2D?

Page 39: Java 2D a kreslení

Graphics vs. Graphics2D?

Page 40: Java 2D a kreslení

Graphics vs. Graphics2D?

Stáří vs. Mládí...

Page 41: Java 2D a kreslení

Graphics vs. Graphics2D?

Třída Graphics2D Kvůli zpětné kompatibilitě potomkem třídy Graphics

Kvůli zpětné kompatibilitě se také stále předává grafický kontext Graphics a na Graphics2D je třeba přetypovat

Přidává nové vlastnosti

Page 42: Java 2D a kreslení

Rozhraní - Shape

Reprezentuje nějaký tvar Rectangle2D, Ellipse2D, Arc2D

Line2D, CubicCurve2D, QuadCurve2D GeneralPath

Vykreslení se děje pomocí metod g2d.draw(Shape s) a g2d.fill(Shape s) třídy Graphics2D

Page 43: Java 2D a kreslení

Rozhraní - Paint

Určuje jakou barvou se bude jaký pixel kreslit

Nastavuje se pomocí metody

g2d.setPaint(Paint p); // g2d.getPaint()

Color

GradientPaint, LinearGradientPaint, RadialGradientPaint

SystemColor – barva pro určitou část GUI

TexturePaint

Page 44: Java 2D a kreslení

Rozhraní - Stroke

Určuje jakým způsobem se budou kreslit čáry a obrysy

Nastavuje se pomocí metody

g2d.setStroke(Stroke s);// g2d.getStroke()

BasicStroke – definuje tloušťku čáry, styl zakončení a zalomení čar a přerušení čar

Page 45: Java 2D a kreslení

Rozhraní - Composite

Určuje způsob zkombinování původní a nové barvy pixelu při kreslení

Nastavuje se pomocí metody

g2d.setComposite(Composite s); 

// g2d.getComposite()

AlphaComposite – původní barva se zkombinuje s kreslenou a umožňuje průhlednost

Page 46: Java 2D a kreslení

Jak transformovat?

Page 47: Java 2D a kreslení

Jak transformovat?

Page 48: Java 2D a kreslení

Jak transformovat?

Kreslených transformerů se ptát nebudeme...

Page 49: Java 2D a kreslení

Jak transformovat?

...jednoduše použijeme

AffineTransform

Page 50: Java 2D a kreslení

Transformace

Je možné provést afinní transformaci systému souřadnic (transformace je reprezentována maticí)

Třída AffineTransform obaluje matici Transformaci provedeme postupně pomocí metod translate (posun počátku), rotate (rotace) a scale (změna měřítka) objektu třídy AffineTransform

Nastavuje se pomocí metody g2d.setTransform(AffineTransform t); 

// g2d.getTransform()

Page 51: Java 2D a kreslení

Polygony?

Page 52: Java 2D a kreslení

Polygony?

Page 53: Java 2D a kreslení

Polygony?

Kdepak závodní polygon...

...kreslit budeme!

Page 54: Java 2D a kreslení

Polygony a obecné křivky

Mnohoúhelníky Uzavřené tvary složené z úseku rovných čar Lze je vykreslit pomocí metod g.drawPolygon(int[] xPoints, int[] yPoints, int point)

a g.fillPolygon(int[] xPoints, int[] yPoints, int point) třídy Graphics

Polygon může být reprezentován třídou Polygon, která obsahuje metodu addPoint() pro přidání bodu

Page 55: Java 2D a kreslení

Polygony a obecné křivky

Lomené čáry Posloupnosti bodů spojené rovnými čarami Uzavřené lomené čáry jsou polygony Lze je vykreslit pomocí metody g.drawPolyline(int[] xPoints, int[] yPoints, int point)

Page 56: Java 2D a kreslení

A to je pro dnešek vše. Otázky?

Děkuji za pozornost!