SurfaceView zeichnen unglaublich komplex?

  • Antworten:4
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 144

14.09.2013 14:38:50 via Website

Hey liebe Community,

im Moment verzweifle ich an einer für Euch wahrscheinlich simplen Aufgabe.
Ich möchte gerne eine Bitmap in eine SurfaceView zeichnen, versuchter Code:
1public class MainActivity extends Activity {
2 myView theView;
3
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 theView = new myView(this);
8 setContentView(theView);
9 }
10
11 @Override
12 public boolean onCreateOptionsMenu(Menu menu) {
13 getMenuInflater().inflate(R.menu.main, menu);
14 return true;
15 }
16
17}
1public class myView extends SurfaceView implements Runnable {
2
3 SurfaceHolder surfaceHolder;
4 Bitmap bmp;
5
6 public myView(Context context) {
7 super(context);
8
9 surfaceHolder = getHolder();
10 surfaceHolder.addCallback(new SurfaceHolder.Callback() {
11
12 @Override
13 public void surfaceDestroyed(SurfaceHolder holder) {
14
15 }
16
17 @Override
18 public void surfaceCreated(SurfaceHolder holder) {
19 Canvas canvas = surfaceHolder.lockCanvas();
20 onDraw(canvas);
21 surfaceHolder.unlockCanvasAndPost(canvas);
22
23 }
24
25 @Override
26 public void surfaceChanged(SurfaceHolder holder, int format,
27 int width, int height) {
28
29 }
30 });
31 bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
32 }
33
34 @Override
35 protected void onDraw(Canvas canvas) {
36 super.onDraw(canvas);
37 canvas.drawColor(Color.WHITE);
38 canvas.drawBitmap(bmp, 0, 0, null);
39
40 }
41
42 @Override
43 public void run() {
44
45 }
46
47}

An den fett gedruckten Stellen verstehe ich allerdings nicht, warum ich hier 2 mal ein Canvas Object erstellen muss und finde die Antwort auch nicht bei Google -.- .
Würdet ihr mir bitte helfen :grin:

grüße Fabian

Antworten
  • Forum-Beiträge: 144

14.09.2013 18:31:10 via Website

Hey impjor@
Die onDraw Methode möchte doch als Parameter einen canvas haben, auf den sie zeichnen kann?
Erstelle ich diesen Canvas in der SurfaceCreated Methode oder rufe ich da nur den Canvas der onDraw Methode auf?
Ich habe diesen Code von Panjutorials einfach mal kopiert, verstehe aber leider nicht, warum ich nen Canvas haben muss und nicht einfach auf mein linearLayout zeichnen kann?
Dauernd suche ich auf developer.android.com eine simple Erklärung und finde nur XML Dateien, mit den ich nichts anfangen kann?

grüße Fabian

Antworten
  • Forum-Beiträge: 1.793

14.09.2013 21:36:04 via App

Gerade nochmal drübergesehen, der Code ist leider so nicht richtig.
Zu deiner Frage:
Man kann nicht in eine View zeichen, sondern muss eine eigene implementieren, die das übernimmt.
Je nach Anwendungszweck gibt es zwei Möglichkeiten:
1.: Einfach eine neue Klasse erstellen, die von View erbt, dann die onDraw-Methode überschreiben und auf das Canvas malen. Fertig.
Nachteil: Android entscheidet selber, wann es die onDraw aufruft, wann also neugezeichnet wird. Entgegenkommen kann man, wenn man alle x Millisikunden invalidate() auf die View aufruft - das ist aber nur ein Hinweis an Android, ob die View neugezeichnet wird bleibt aber beim OS.
2.: Die SurfaceView-Methode: Die onDraw muss nicht überschrieben werden, stattdessen kann man sich das Canvas vom SurfaceHolder holen und so selber bestimmen, dass genau jetzt neu gezeichnet wird. Nachteil: Deutlich aufwendiger.

Der Code oben ist aber unnutz, da er am Anfang (wenn die View erstellt wird (SurfaceCreated)) selber auf den Canvas mal, dann aber nichts tut und das Malen wieder Android überlässt, da hätte man auch gleich von View erben können.

Sag einfach mal, was du machen willst (spiel, Kompass, ...), eventuell brauchst du keine SurfaceView
LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
  • Forum-Beiträge: 144

14.09.2013 22:51:30 via Website

Jetzt lach bitte nicht, aber ich bin ganz versessen darauf, Doodle-Jump nachzumachen. Mich fasziniert dieses Spiel einfach von der Programmierung her, ich spiele es nur noch und versuche mich in dieses System hinein zu versetzen.
Natürlich möchte ich nur die Sprünge nachmachen, bedeutet, ich will dass der Android so springt wie bei Doodle-Jump.
Leider verstehe ich im Moment noch nicht, wie man sowas programmieren soll und bin am überlegen, ob es nicht einfacher ist, eine Engine dafür zu benutzen...
Grundkenntnisse in Java sind natürlich vorhanden und eine erste App war im App-Store, welche einfach nur ein Wort rückwärts mit TTS ausgegeben hat. :)

//push

Grüße Fabian

— geändert am 16.09.2013 18:56:11

Antworten