Jednoduché kreslení prstem pro Android v Javě
V předchozím kvízu, Kvíz - Základy vývoje Android aplikací v Javě, jsme si ověřili nabyté zkušenosti z kurzu.
V dnešním Android tutoriálu si ukážeme jak vytvořit jednoduchou
aplikaci pro kreslení. Ta se nám může hodit, když budeme
chtít něco načrtnout a někomu to ukázat (například při vysvětlování)
nebo jen tak pro chvilky nudy. A samozřejmě k procvičení programování
Ukažme si motivační opbrázek hotové aplikace, ať nám to jde lépe od ruky:

Úvod
Projekt budeme vyvíjet v Android Studiu. Spustíme program a zvolíme založit nový projekt.

Vybereme, že chceme vytvořit novou prázdnou aktivitu:

Dále nakonfigurujeme samotný projekt. Vyplníme jméno, název balíčku a lokaci, kam umístíme projekt:

Konfiguraci potvrdíme tlačítkem Finish a zobrazí se nám samotné vývojové prostředí.
onTouchEvent()
Než se pustíme do samotného kreslení, seznámíme se s událostí
onTouchEvent(MotionEvent event)
. Tato událost je volána vždy,
když dojde k dotyku na obrazovku. My si pro začátek do TextView
vypíšeme souřadnice, na které jsme se obrazovky dotkli.
Přidáme tedy do XML layoutu TextView
. V aktivitě si uložíme
referenci na TextView
pomocí metody findViewById()
,
což provedeme v metodě onCreate()
:
public class MainActivity extends AppCompatActivity { private TextView coords; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); coords = findViewById(R.id.coords); } }
Nyní přepíšeme chování metody onTouchEvent()
, čímž
budeme reagovat na dotyk prstem na obrazovku. Aktuální pozici (souřadnice)
prstu vypíšeme, abychom viděli, zda se zjišťují správně:
@Override public boolean onTouchEvent(MotionEvent event) { // Získání souřadnic float xPos = event.getX(); float yPos = event.getY(); // Zobrazení na textView this.coords.setText(getString(R.string.label_coords) + (int) xPos + "x" + (int) yPos); return true; }
Pokud aplikaci nyní spustíme a budeme jezdit prstem po obrazovce, budou se
souřadnice zobrazovat v TextView
:

Canvas
Když již umíme zobrazit souřadnice, tak na nich můžeme začít kreslit.
Z metody onCreate()
odstraníme vše kromě volání
super.onCreate()
. Z layoutu rovněž odmažeme přidaný
TextView
, protože jej již nebudeme potřebovat. Napíšeme si
totiž vlastní, na kterém budeme zobrazovat naše čárance.
Třída MyCanvas
Vytvořme si nyní novou třídu, například MyCanvas
. To
uděláme pravým klikem na package projektu a výběrem
Add/Class. Zde vyplníme pouze název a potvrdíme. Vytvoří
se nám prázdná třída:
package cz.devbook.aepaint; public class MyCanvas { }
Klíčovým slůvkem extends
podědíme View
. To
znamená, že třída reprezentuje něco, co se dá zobrazovat:
public class MyCanvas extends View
Klepnutím přidáme import
a necháme za nás IDE i doplňit
konstruktor (ten první s parametrem Context
).
Objekt Paint
Vytvoříme třídní proměnnou paint
typu
Paint
:
private Paint paint = new Paint();
Ta nyní obsahuje vlastnosti k nastavení pera. To si teď nastavíme v
kontruktoru naší nové třídy, hned pod klíčovým slovem
super
, kterým se volá kontruktor předka. Můžete použít jaké
nastavení chcete, zde si vysvětlíme co která metoda dělá.
Výchozí barva pera je černá. Zadává se ve formátu
0xffxxxxxx
, kde x
reprezentuje klasickou CSS notaci
barev. Po naimportování import android.graphics.Color;
lze volit
barvy i příjemnější cestou pomocí konstant:
paint.setColor(Color.RED);
Dále zapneme vyhlazování:
paint.setAntiAlias(true);
A určíme styl vykreslení. Budeme používat cestu, kterou když
namalujeme, tak se automaticky uzavře. Proto použijeme styl
Paint.Style.STROKE
, což je okraj. Ten nám zobrazí jen křivku,
kterou kreslíme:
paint.setStyle(Paint.Style.STROKE);
Dále nastavíme zaoblení koncové a začáteční špičky křivky a bodů v ohybu:
paint.setStrokeCap(Cap.ROUND);
paint.setStrokeJoin(Join.ROUND);
paint.setStrokeMiter(.5f);
Konečně nastavíme i tloušťku pera v pixelech:
paint.setStrokeWidth(5);
Path
Můžete vyzkoušet i další nastavení, tato však považuji za
nejpřínosnější. Nyní si vytvoříme další třídní proměnnou
path
typu Path
. Ta bude užita pro uchovávání
souřadnic cesty.
private Path path = new Path();
onTouchEvent()
Do třídy přidáme událost onTouchEvent()
, kterou již
známe. Lehce ji však pozměníme. Pomocí cesty budeme kreslit čáru.
Počátek bude v bodě, kde došlo k dotyku. Dále budeme kreslit do bodu, kde
došlo k pohybu nebo ke skončení dotyku.
Čáru kreslíme proto, že displej neregistruje všechny body na křivce, kterou prstem kreslíme, ale pouze některé. Kdybychom je nespojili čárou, kreslili bychom tečkovaně.
@Override public boolean onTouchEvent(MotionEvent event) { // Deklarace proměnných pro ukládání pozice dotyku float xPos = event.getX(); float yPos = event.getY(); // Zpracování akcí switch (event.getAction()) { // Při dotyku, se vyresetuje výchozí pozice case MotionEvent.ACTION_DOWN: path.moveTo(xPos, yPos); break; // Při pohybu nebo opuštění obrazovky case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: // Nastaví se současné souřadnice path.lineTo(xPos, yPos); break; } // Překreslení invalidate(); return true; }
onDraw()
Teď ještě přidáme rychlý event vykreslování onDraw()
,
kde cestu vykreslíme:
@Override public void onDraw(Canvas canvas) { canvas.drawPath(path, paint); }
Hlavní třída
Přepneme se do hlavní třídy a vytvoříme třídní proměnnou
myCanvas
:
private MyCanvas myCanvas;
Té v metodě onCreate()
přiřadíme instanci naší třídy a
použijeme ji:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Přepnutí zobrazování na naši vlastní třídu myCanvas = new MyCanvas(this); setContentView(myCanvas); }
Nyní aplikaci vyzkoušíme.
Pokud nám kreslení funguje v pořádku, můžete si vyzkoušet měnit nějaké hodnoty a pohrát si s nastavením. Pak budeme pokračovat. Ještě přidáme nějaké drobnůstky.
V druhé části tutoriálu aplikaci vylepšíme, např. přidáme podporu pro multi-touch, čištění plátna a další vychytávky.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 31x (768.42 kB)
Aplikace je včetně zdrojových kódů