2010-03-29 9 views
6

HI alle,Neu bei Android - Zeichnen einer Ansicht zur Laufzeit

Ich bin gerade erst mit der Entwicklung für Android. Ich möchte eine meiner iPhone-Anwendungen portieren, aber ich weiß nicht, wie ich zur Laufzeit eine Ansicht zeichnen kann (eine Ansicht, die nicht im XML deklariert ist). Im Grunde möchte ich ein einfaches Rechteck zeichnen, aber dann in der Lage sein, seinen Rahmen zu manipulieren, nachdem er gezeichnet wurde.

Tut mir leid, wenn das eine wirklich, wirklich einfache Frage ist, aber ich kann nicht scheinen, etwas Entsprechung zum iPhone SDK hier zu finden.

Vielen Dank im Voraus!

Antwort

7

Es klingt, als ob Sie mit 2D-Grafiken experimentieren möchten - dafür sollten Sie eine Canvas verwenden. Sie können die Zeichnung des Canvas über die invalidate()-Methode steuern, die Android anweist, die ganze Sache neu zu zeichnen, die Ihre angepasste Methode onDraw() auslöst. Sie erwähnen, dass Sie die XML-Datei nicht verwenden möchten, aber das ist der einfachste Weg, um einen Canvas zu erstellen - Sie müssen seinen Inhalt nicht in der XML-Datei definieren, sondern einfach der Layoutdatei mitteilen, dass sie dort ist. Eine leistungsstarke, aber einfache Möglichkeit zum Einfügen eines Canvas in Ihre Anwendung besteht darin, eine Ansicht anzupassen. Fügen Sie beispielsweise in Ihre XML-Datei ein <your.package.CustomView android:.../> Element ein. Dann deklarieren Sie die Klasse CustomView extends View. Jede Art von Zeichnung, die Sie machen möchten, fügen Sie die Methode onDraw() ein.

Um zum Beispiel ein Rechteck zu zeichnen, machen Sie so etwas.

//First you define a colour for the outline of your rectangle 
rectanglePaint = new Paint(); 
rectanglePaint.setARGB(255, 255, 0, 0); 
rectanglePaint.setStrokeWidth(2); 
rectanglePaint.setStyle(Style.STROKE); 

//Then create yourself a Rectangle 
Rect rectangle = new Rect(left, top, right, bottom) //in pixels 

//And here's a sample onDraw() 
@Override 
public void onDraw(Canvas canvas){ 
    rectangle.offset(2, 2); 
    canvas.drawRect(rectangle, rectanglePaint); 
} 

Jedes Mal, invalidate() von Ihrem Programm aufgerufen wird, wird die Ansicht neu gezeichnet und das Rechteck bewegt 2px nach unten und nach rechts. Hinweis: Das Neuzeichnen geschieht nur, wenn der Haupt-Thread 'wartet'. Mit anderen Worten: Wenn Sie eine Schleife mehrfach mit Invalidate aufrufen, wird die View nicht wirklich gezeichnet, bis die Schleife beendet ist. Sie können dies umgehen, aber das fügt mehr Komplikationen hinzu. Ein Beispiel dafür ist das LunarLander-Beispielspiel von Google - ein einfaches Spiel, das eine benutzerdefinierte Ansicht, zwei Threads und die Implementierung kontinuierlicher Animationen demonstriert.

+0

Funktioniert wunderbar, danke! –

Verwandte Themen