java 2d a kreslení

Post on 15-May-2015

4.927 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

Co je to ”grafický kontext”?

Co je to ”grafický kontext”?

Co je to ”grafický kontext”?

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

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)

Jak mohu zvolit barvu?

Jak mohu zvolit barvu?

Jak mohu zvolit barvu?

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

...nebo...

Jak mohu zvolit barvu?

...nebo...

...použijeme třídu

java.awt.Color

Jak mohu zvolit barvu?

Color.GREEN

Color.YELLOW

Color.BLUE

Color.ORANGE

Color.WHITE

Color.RED

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>

Jaké písmo vybrat?

Jaké písmo vybrat?

Aš nazg durbatulűk...

Jaké písmo vybrat?

Tak jednoduché to nebude...

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

Jaké jsou fontové metriky?

Jaké jsou fontové metriky?

Jaké jsou fontové metriky?

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

Jaké jsou fontové metriky?

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

Jaké jsou fontové metriky?

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

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

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

Jak kreslit primitivní objekty?

Jak kreslit primitivní objekty?

Jak kreslit primitivní objekty?

Třeba jako Picasso (Guernica)...

...nebo...

Jak kreslit primitivní objekty?

...nebo...

...použijeme metody třídy

java.awt.Graphics

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 (-||-)

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)

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)

Jak kreslit obrázky?

Jak kreslit obrázky?

Jak kreslit obrázky?

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

Jak kreslit obrázky?

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

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

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)

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

Graphics vs. Graphics2D?

Graphics vs. Graphics2D?

Graphics vs. Graphics2D?

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

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

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

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

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

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

Jak transformovat?

Jak transformovat?

Jak transformovat?

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

Jak transformovat?

...jednoduše použijeme

AffineTransform

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()

Polygony?

Polygony?

Polygony?

Kdepak závodní polygon...

...kreslit budeme!

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

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)

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

Děkuji za pozornost!

top related