| |||||||
Das Thema "Zeichnen auf Canvas" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.
|
| | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Android-Hilfe.de Mitglied Registriert seit: 06.07.2011
Beiträge: 71
Abgegebene Danke: 14
Erhielt 7 Danke für 7 Beiträge
| ich habe folegndes Problem, ich versuche über eine Methode aus einer Activity-Klasse auf eine Canvas/View Klasse zu zeichnen und anscheinend habe ich da nen tierischen Denkfehler drinne nur ich kann ihn mir im Moment nicht erklären. Wäre nett wenn sich jemand folgendes mal anschauen könnte und mir weiterhelfen könnte. beim Aufruf der Methode addLine passiert nämlich rein gar nix auf meinem "Canvas" Code: public class Striche extends View{
Paint paint;
Canvas canvas;
int breite;
int hoehe;
boolean isInitialized;
Bitmap bitmap;
public Striche(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
isInitialized = false;
}
private void init()
{
bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);
canvas = new Canvas();
isInitialized = true;
}
@Override
protected void onDraw(Canvas canvas) {
if (!isInitialized)
init();
Bitmap eBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.deckel) ;
canvas.drawBitmap(eBitmap ,0,0, null) ;
breite = canvas.getWidth();
hoehe = canvas.getHeight();
Paint bild = new Paint();
paint.setColor(R.color.kulli);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(6);
paint.setAntiAlias(true);
canvas.drawLine(40,40,60,60, paint);
}
public void addLine(int ort, int count){
paint = new Paint();
canvas.drawLine(0,0,77,132,paint);
paint.setColor(R.color.schwarz);
canvas.drawLine(40,40,70,70, paint);
paint.setColor(R.color.kulli);
}
} PSEUDOCODE DES AUFRUFS: Code: Striche kulli;
LinearLayout layout;
..onCreate(){
kulli = new Striche(this, null);
layout = (LinearLayout)findViewById(R.id.lay);
layout.addView(kulli);
...
}
onClickListener(){
..
kulli.addLine(1, 1);
} Grüße Soma |
| | |
| | #2 (permalink) |
| Android Experte Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
|
Du hast zwei Variablen namens Canvas. Einmal als Parameter in onDraw (was du darein malst, wird sichtbar) und dann die Instanzvariable - dort malt addLine hinein. Wieso sollte das, was du in den einen Canvas malst, in dem anderen erscheinen? Um eins vorneweg zu nehmen: Du solltest einen Canvas nicht als Instanzvariable speichern. Wenn du von außen (also nicht in onDraw) den Inhalt eines Views verändern willst, dann macht man eher so, dass du in eine Bitmap malst, deren Canvas du kontrollierst (da sieht dein Code auch so aus, als hättest du das schon halb implementiert) und im addLine invalidierst du dann den View, der dann im onDraw die bitmap abholt und in den "sichtbaren" Canvas malt.
__________________ Kein Support via PN/eMail. Bitte das Forum benutzen - dort haben alle etwas davon. Bei Entwicklerfragen zu abstürzenden Apps bitte immer die Ausgabe von LogCat posten. Tipp: Zum "Danke" sagen gibt es einen Button. ![]() Geändert von DieGoldeneMitte (28.07.2011 um 14:31 Uhr) |
| | |
| Folgender Benutzer bedankt sich bei DieGoldeneMitte für diesen Beitrag: | soma-web (28.07.2011) |
| | #3 (permalink) |
| Android-Hilfe.de Mitglied Registriert seit: 06.07.2011
Beiträge: 71
Abgegebene Danke: 14
Erhielt 7 Danke für 7 Beiträge
|
Danke für die Antwort! Aber kannst du mir nen Pseudocode schreiben wie ich das mach? Also du meintest ich sollte auf die bitmap malen und die dann im onDraw immer wieder neu malen? Dumme frage wann wird denn die onDraw Methode immer aufgerufen? Code: ondraw(){
....
canvas.drawBitmap(bitmap, 10, 10, paint);
}
public void addLine(int ort, int count){
Canvas c = new Canvas(bitmap);
Paint p = new Paint();
p.setColor(R.color.kulli);
p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(6);
p.setAntiAlias(true);
c.drawLine(0,0,77,132,p);
p.setColor(R.color.schwarz);
c.drawLine(40,40,70,70, paint);
p.setColor(R.color.kulli);
} Danke dir! Geändert von soma-web (28.07.2011 um 14:47 Uhr) |
| | |
| | #4 (permalink) |
| Android-Hilfe.de Mitglied Registriert seit: 06.07.2011
Beiträge: 71
Abgegebene Danke: 14
Erhielt 7 Danke für 7 Beiträge
|
Ich habs danke!!!! Eine frage hab ich noch und zwar sind meine neuen Linien immernoch schwarz wora kann das liegen? Code: package happy.prog.bier;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class Striche extends View{
Paint paint;
Canvas canvas;
int breite;
int hoehe;
boolean isInitialized;
Bitmap bitmap;
public Striche(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
isInitialized = false;
}
private void init()
{
bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ALPHA_8);
canvas = new Canvas();
isInitialized = true;
}
@Override
protected void onDraw(Canvas canvas) {
if (!isInitialized)
init();
Bitmap eBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.deckel) ;
this.canvas = canvas;
canvas.drawBitmap(eBitmap ,0,0, null) ;
breite = canvas.getWidth();
hoehe = canvas.getHeight();
Paint bild = new Paint();
paint.setColor(R.color.kulli);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(6);
paint.setAntiAlias(true);
canvas.drawLine(40,40,60,60, paint);
canvas.drawBitmap(bitmap, 10, 10, paint);
;
}
public void addLine(int ort, int count){
Canvas c = new Canvas(bitmap);
Paint p = new Paint();
p.setColor(Color.BLUE);
//p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(6);
p.setAntiAlias(true);
c.drawLine(0,0,77,132,p);
p.setColor(Color.BLUE);
c.drawLine(40,40,70,70, paint);
p.setColor(R.color.kulli);
}
} den Paint ändern vor dem zeichnen des bitmaps dann läufts ohne Probleme. Anscheinend is ein Btmap wirklcih nur der verfahrweg meiner Linie und die Färbung kommt dann erst beim zeichnen auf die canvas mit dem jeweiligen Paint. Danke DieGoldeneMitte! Geändert von soma-web (28.07.2011 um 15:15 Uhr) |
| | |
| | #5 (permalink) |
| Android-Hilfe.de Mitglied Registriert seit: 06.07.2011
Beiträge: 71
Abgegebene Danke: 14
Erhielt 7 Danke für 7 Beiträge
|
Bräcuhte nochmal Hilfe und zwar versuch ich das View per Java in mein LinearLayout einzufügen, aber ich krieg es nicht gebacken: NULLPOINTEREXCEPTION Ich probier es über folgenden Code: Code:
onCreate(){
...
Striche temp = new Striche(this, null);
LinearLayout lay = (LinearLayout)findViewById(R.id.testlay);
lay.addView(temp);
setContentView(R.layout.zettel);
...} Danke DieGoldeneMitte ^^ Grüße Soma |
| | |
| | #6 (permalink) |
| Android Experte Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
|
Wie soll er den View (findView) finden, wenn du ihn noch garnicht definiert (setContentView) hast? Dieser Fall war leicht zu sehen, aber das nächste mal ermittle bitte die Zeile, in der die NPE passiert ist (steht im LogCat) und zeig und deren Inhalt. ADD: Um Einfluss auf die Größe des Views zu nehmen, musst du onMeasure und onLayout überladen.
__________________ Kein Support via PN/eMail. Bitte das Forum benutzen - dort haben alle etwas davon. Bei Entwicklerfragen zu abstürzenden Apps bitte immer die Ausgabe von LogCat posten. Tipp: Zum "Danke" sagen gibt es einen Button. ![]() Geändert von DieGoldeneMitte (29.07.2011 um 16:14 Uhr) |
| | |
| | #8 (permalink) |
| Android Experte Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
|
Achso, die ID war auch noch falsch? ![]() Ich meinte aber was anderes: Du musst setContentView() vor findViewById() aufrufen. findView sucht im contentView (und nicht in den Resourcen oder so). ADD: Wenn du aus einer xml einen View aufbauen willst, ohne ihn zum Content zu machen, dann musst du einen LayoutInflater bemühen.
__________________ Kein Support via PN/eMail. Bitte das Forum benutzen - dort haben alle etwas davon. Bei Entwicklerfragen zu abstürzenden Apps bitte immer die Ausgabe von LogCat posten. Tipp: Zum "Danke" sagen gibt es einen Button. ![]() Geändert von DieGoldeneMitte (29.07.2011 um 17:23 Uhr) |
| | |
![]() |
|
| Themen-Optionen | |
| Ansicht | |
| |
| ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Link, TextView, Button auf Canvas | baileys | Android App Entwicklung | 0 | 01.11.2010 15:44 |
| Canvas auf über xml erstellte ImageView | missG | Android App Entwicklung | 0 | 29.10.2010 11:49 |
| Android Views zeichnen auf SurfaceView | Makaveli | Android App Entwicklung | 4 | 10.09.2010 23:08 |
| Mit canvas ein Bild an beliebiger Stelle zeichnen | chrissooo | Android App Entwicklung | 2 | 28.05.2010 15:44 |
| 2D Spiel - Gerade auf Linie zeichnen | funcoder | Android App Entwicklung | 6 | 18.01.2010 19:45 |