Erste wirkliche App mit Canvas

  • 4 Antworten
  • Letztes Antwortdatum
P

paxis

Fortgeschrittenes Mitglied
0
Hallo Leute,

da ich nun wirklich in die Android Programmierung einsteigen möchte, dachte ich melde mich hier auch mal kostenslos an :)!

Jetzt habe ich sogar direkt eine Frage bei der ihr mir hoffentlich helfen könnt :)!
Ich poste erstmal meinen Code:
Code:
package de.tobi.strategiespiel;

import android.R;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.util.AttributeSet;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

public class Spielfeld extends ImageView {
 private int test;
 private Spielfeld test2;
     
    public Spielfeld(Context context, AttributeSet attrs) {
        super(context, attrs);        }
    
         public void onDraw(Canvas canvas) {
              super.onDraw(canvas);
            
              // 1. Paint-Objekt für Blauton und 
            // Linienbreite von 5 Pixeln erzeugen
                Paint pinsel = new Paint();
             pinsel.setColor(Color.rgb(64, 64, 255));
             pinsel.setStrokeWidth(5);
            
                // Diagonale durch Leinwand zeichnen
             canvas.drawLine(0, 0, getWidth(), getHeight(), pinsel);
             if (test==1) {
                canvas.drawLine(10, 0, getWidth(), getHeight(), pinsel);
             }
         }
            
    
    

    

    public void test(int i) {
        test=i;
        postInvalidate();
        
        // TODO Auto-generated method stub
        
    }


}

class ThreadAusführung extends Thread{
    
    public boolean weiter;
    
     Spielfeld test1;
    
    public void run() {
        Spielfeld test1 = new Spielfeld(null, null);
         this.test1=test1;
        while(weiter) {
                
     test1.onDraw(null);    
     
     try { 
         sleep(200); 
         }
     catch(InterruptedException e) { } } }
     }

Code:
package de.tobi.strategiespiel;


import android.R.color;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;



public class MainActivity extends Activity implements OnClickListener {
    private Button test;
    private Spielfeld zview;
    private ThreadAusführung TA;
    
    
    public void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Spielfeld zview = new Spielfeld(null, null);
        ThreadAusführung TA = new ThreadAusführung();
    test= (Button) findViewById(R.id.button1);
    test.setOnClickListener(this);    
    
    }

    @Override
    public void onClick(View v) {
        if (v == test) {
        zview.test(1);
        TA.run();
        }
        // TODO Auto-generated method stub
        
    }
    


}

Um zu erklären, was ich genau machen möchte:
Ich möchte eine Canvas erzeugen auf der ich mithilfe von Buttons z.B: Rechtecke bewegen!
In Der Main Activity wird eigentlich nur ein OnClickListener festgelegt. In der Activity Spielfeld wird erstmal die Canvas mit on Draw erstellt :D!
Dann eine Testmethode (public void Test) die eigentlich nur die int Variable Test ändern kann :D!
Dann ist da noch die innere Klasse ThreadAusführung! In der gibt es einen Thread der immer wieder die onDraw Methode ausführen soll!

Wenn ich die App im Emulgator ausführe komme ich bis zur Darstellung der Canvas mit einer Linie und wenn ich auf den Button test Drücke kommt folgendes:
01-28 20:06:56.622: E/AndroidRuntime(265): FATAL EXCEPTION: main
01-28 20:06:56.622: E/AndroidRuntime(265): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.tobi.strategiespiel/de.tobi.strategiespiel.MainActivity}: java.lang.NullPointerException
01-28 20:06:56.622: E/AndroidRuntime(265): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.os.Handler.dispatchMessage(Handler.java:99)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.os.Looper.loop(Looper.java:123)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.app.ActivityThread.main(ActivityThread.java:4627)
01-28 20:06:56.622: E/AndroidRuntime(265): at java.lang.reflect.Method.invokeNative(Native Method)
01-28 20:06:56.622: E/AndroidRuntime(265): at java.lang.reflect.Method.invoke(Method.java:521)
01-28 20:06:56.622: E/AndroidRuntime(265): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-28 20:06:56.622: E/AndroidRuntime(265): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-28 20:06:56.622: E/AndroidRuntime(265): at dalvik.system.NativeStart.main(Native Method)
01-28 20:06:56.622: E/AndroidRuntime(265): Caused by: java.lang.NullPointerException
01-28 20:06:56.622: E/AndroidRuntime(265): at android.view.ViewConfiguration.get(ViewConfiguration.java:211)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.view.View.<init>(View.java:1814)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.view.View.<init>(View.java:1856)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.widget.ImageView.<init>(ImageView.java:112)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.widget.ImageView.<init>(ImageView.java:108)
01-28 20:06:56.622: E/AndroidRuntime(265): at de.tobi.strategiespiel.Spielfeld.<init>(Spielfeld.java:19)
01-28 20:06:56.622: E/AndroidRuntime(265): at de.tobi.strategiespiel.MainActivity.onCreate(MainActivity.java:26)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-28 20:06:56.622: E/AndroidRuntime(265): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
01-28 20:06:56.622: E/AndroidRuntime(265): ... 11 more


Kann mir wer helfen?

Ich glaube das Problem liegt im OnClickEvent, nur was genau??

Danke schonmal :)

paxis
 
Code:
Spielfeld zview = new Spielfeld(null, null);
Das Problem ist hier. Views brauchen beim start *immer* einen Context. Normalerweise nimmt man hier die Activity selbst (also "this").

Aber dein Code ist auch sonst etwas verborkt. Der von dir erzeugte View wird nicht auf den Bidschirm gebracht.

Entweder machst du ein XML Layout, benutzt deinen View dort, lädst das Layout per setContentView und holst dir danach deinen View mittels findViewById, oder du baust dir dein Layout (ungefähr so wie man es auch aus awt/swing kennt) selbst.

Ich empfehle für Anfänger dringend erstere Methode, sobald man mehr als einen View auf dem Bildschirm hat.
 
Ich habe den Code jetzt so umgeändert:
Code:
package de.tobi.strategiespiel;


import android.R.color;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;



public class MainActivity extends Activity implements OnClickListener {
    private Button test;
    private Spielfeld zview;
    private ThreadAusführung TA;
    
    
    public void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        Spielfeld zview = new Spielfeld(this, null);
        ThreadAusführung TA = new ThreadAusführung();
    test= (Button) findViewById(R.id.button1);
    test.setOnClickListener(this);    
    
    }

    @Override
    public void onClick(View v) {
        if (v == test) {
        zview.test(1);
//        TA.run();
        }
        // TODO Auto-generated method stub
        
    }
    


}
Aber beim Button Click stürzt die APP immernoch ab!
Muss was in der Manifest Datei eigentlich geändert werden?
Ach und in der xml Datei von der Methode ist das:
Code:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/linearlayout1" >

   
 <de.tobi.strategiespiel.Spielfeld
        android:layout_width="fill_parent"
        android:layout_height="200dp"
        android:background="#ffffff"
/>

 <Button
     android:id="@+id/button1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="test" />

 <Button
     android:id="@+id/button2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Button" />

 <Button
     android:id="@+id/button3"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Button" />

 <Button
     android:id="@+id/button4"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Button" />

</TableLayout>
Weiß jemand weiter? :)

Danke schonmal für die Hilfe ich ich bekommen habe :)
 
Zuletzt bearbeitet:
ich wiederhole mich ungern:

der erzeugte view im onCreate muss weg.
 
Wärest du so freundlich und könntest vielleicht den Fehler per Zitat in Rot makieren?
Stehe gerade ziemlich auf dem Schlauch...
Sorry für so was einfaches... :(
 

Ähnliche Themen

U
  • unerfahrenerAppEntwickler
Antworten
3
Aufrufe
1.029
swa00
swa00
K
Antworten
3
Aufrufe
480
mezzothunder
mezzothunder
AnnaBauer21
Antworten
5
Aufrufe
227
swa00
swa00
Zurück
Oben Unten