onDraw jede Millisekunde aufrufen?

  • Antworten:5
Christian
  • Forum-Beiträge: 3

13.05.2012, 17:30:36 via Website

Hallo,
ich Programmiere seit ca. 1 Woche in Android und möchte mal wissen, wie ich ambesten die onDraw Methode von Canvas jede Millisekunde aufrufen lassen kann?

Ich bedanke mich schonmal im Voraus.

MfG

Antworten
Maximilian O
  • Forum-Beiträge: 990

13.05.2012, 19:41:19 via Website

Hey Christian,
ist dir klar was du da gerade fragst?

Nehmen wir mal an, dass es funktionieren würde, heißt dass das du alle Objekte 1000 Mal pro Sekunde zeichnest. Ein gutes Auge kann maximal 60 FPS wahrnehmen, du kämest dann mit 1000 daher...

Lege dich bei Spielen oder ähnlichem nie auf konstante FPS fest, sondern lasse die onDraw einfach so oft aufrufen wie möglich und berechne die Veränderungen aus der vergangenen Zeit. Was du vor hast ist technisch (noch) nicht möglich.

Liebe Grüße Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Christian
  • Forum-Beiträge: 3

13.05.2012, 20:07:10 via Website

Hallo, vielen Dank.

Ich habe bei mir im Spiel ein Menu, indem ich verschiedene Spielvariante wählen kann und per Button möchte ich einfach, das diese pixel by pixel nach links geschoben werden, wenn ich auf Pfeil-Rechts klicke, deshalb möchte ich das onDraw indem Moment jede Millisekunde ausgeführt wird.

z.B. Klicke ich auf einem Button, die ich in Canvas zeichne:
1//Button für nächste Map
2canvas.drawBitmap(button002Bitmap, (screenWidth/2)+75, (screenHeight/2)-(26/2), null);
3if ((touchX > (screenWidth/2)+75) && (touchX < (screenWidth/2)+75+26)) {
4 if ((touchY > (screenHeight/2)-(26/2)) && (touchY < (screenHeight/2)-(26/2)+26)) {
5 tmpmapNr = mapNr;
6 moveMap = 2;
7 postInvalidate();
8 }
9}
und dann soll ein Timer oder Thread z.B. 50 mal die Methode postInvalidate(); aufrufen.

Wie könnte ich das denn ambesten anstellen?

Danke schonmal für die Hilfe.

MfG

Antworten
Maximilian O
  • Forum-Beiträge: 990

13.05.2012, 21:15:34 via App

Warum Pixel bei Pixel? Man macht das anders:
1. Speichere dir sei Zeit dir zwischen 2 Mal Vorgänge vergeht
2. Berechne um wieviele Pixel sich das Element in der Zeit besetzt haben soll (pixelToMove=vergangeneZeit*Gesamtlänge/Gesamtzeit)

So macht man das :)

Liebe Grüße Maximilian

— geändert am 14.05.2012, 06:45:50

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Christian
  • Forum-Beiträge: 3

14.05.2012, 12:35:09 via Website

Danke Dir.

Ich weiss echt nicht, wie du das meinst, sry.

Ich hab mir das so überlegt:
1class Panel extends View implements OnTouchListener {
2 public void startGameTimeElapseThread(){
3 new Thread(new Runnable() {
4 public void run() {
5 while (true){
6 try {
7 synchronized (this) {
8 this.wait(1000);
9 }
10 } catch (InterruptedException e) {
11 e.printStackTrace();
12 }
13 postInvalidate();
14 }
15 }
16 }).start();
17 }
18.................
19.................
20.................
21.................

würde das denn gehen, wenn ich diese Methode in onCreate aufrufen würde?

MfG

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

14.05.2012, 14:42:57 via Website

mal davon abgsehen, dass das blödsinn ist, würde ja ein

this.wait(1000);

1 sekunde warten und erst dann postInvalidate() aufrufen.

swordiApps Blog - Website

Ansgar M

Antworten