canvas in view anzeigen

  • Themenstarter Themenstarter Gast2
  • Beginndatum Beginndatum
G

Gast2

Gast
Hi,

ich habe eine canvas erstellt und möchte diese nun auf meinem view anzeigen lassen.
Leider bekomme ich das nicht hin,
meine canvas wird nicht angezeigt.
Hier meine Quellen...
vielleicht kann mir jemand sagen (schreiben) was fehlt?!

activity_main.xml
[XML]<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relativ_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
android:id="@+id/txv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="18dp"
android:layout_marginTop="26dp"
android:text="@string/hello_world"
android:textSize="30dp"
tools:context=".MainActivity" />

<ivi.uebungondraw2.DrawView
android:layout_below="@+id/txv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />

</RelativeLayout>[/XML]

MainActivity.java
Java:
package ivi.uebungondraw2;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

	DrawView drawView;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		drawView = new DrawView(this);
	}
}

DrawView.java
Java:
package ivi.uebungondraw2;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.View;

public class DrawView extends View {
	Bitmap bitmap;
	Canvas bitmapCanvas;

	boolean isInitialized;
	Paint paint = new Paint();

	public DrawView(Context context) {
		super(context);

		paint.setColor(Color.BLACK);
		paint.setStyle(Style.FILL_AND_STROKE);

		isInitialized = false;
	}

	private void init() {
		bitmap = Bitmap.createBitmap(470, 320, Bitmap.Config.RGB_565);

		bitmapCanvas = new Canvas();
		bitmapCanvas.setBitmap(bitmap);
		bitmapCanvas.drawColor(Color.rgb(250, 250, 250));

		isInitialized = true;

		bitmapCanvas.drawLine(10, 10, 10, 300, paint);
		bitmapCanvas.drawLine(10, 160, 310, 160, paint);
		invalidate();
	}

	@Override
	public void onDraw(Canvas canvas) {
		if (!isInitialized)
			init();
		canvas.drawBitmap(bitmap, 0, 0, paint);
	}
}

? ? ?
 
Was soll den passieren? Du definierst einmal deinen View im XML und einmal erstellt du diesen View im Source, weist ihn aber nirgends zu.

Ich bin mir nicht sicher, aber ich glaube: Eigene Views fürs XML müssen den View-Konstruktor mit 2 Parametern bereitstellen [wobei ich generell immer alle 3 Konstruktoren vom View implementiere).
Zudem: wenn du mit dem View arbeiten willst, würde ich mit IDs arbeiten.
 
Ok, ID füge ich hinzu und auch die drei Parameter.

ABER so wie der Quelltext oben zu sehen ist gibt es eine InflateException in der xml, Zeile 19
[XML] <ivi.uebungondraw2.DrawView[/XML]

dabei habe ich den namespace mit copy + paste übernommen, Fehler in der Schreibung halte ich für ausgeschlossen.

Warum kann die canvas denn nicht inflated werden?
 
Zeig mal bitte deinen angepassten DrawView und poste sicherheitshalber mal noch die genaue Fehlermeldung.
 
DrawView:
Java:
package ivi.uebungondraw2;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;

public class DrawView extends View {
	
	boolean isInitialized;
	int hoehe;
	Paint paint = new Paint();
	Bitmap bitmap;
	Canvas bitmapCanvas;

	public DrawView(Context context, AttributeSet attrs, int height) {
		super(context, attrs);
		hoehe = height;
		paint.setColor(Color.BLACK);
		paint.setStyle(Style.FILL_AND_STROKE);
		isInitialized = false;
	}

	private void init() {
		bitmap = Bitmap.createBitmap(470, hoehe, Bitmap.Config.RGB_565);
		bitmapCanvas = new Canvas();
		bitmapCanvas.setBitmap(bitmap);
		bitmapCanvas.drawColor(Color.rgb(250, 250, 250));
		isInitialized = true;
		bitmapCanvas.drawLine(10, 10, 10, 300, paint);
		bitmapCanvas.drawLine(10, 160, 310, 160, paint);
		invalidate();
	}

	@Override
	public void onDraw(Canvas canvas) {
		if (!isInitialized) init();
		canvas.drawBitmap(bitmap, 0, 0, paint);
	}
}

die Fehlermeldung (LogCat):
fehler28.bmp
 
Zuletzt bearbeitet von einem Moderator:
View | Android Developers

Schau nochmal in die Dokumentation. Du brauchst du diesen Konstruktor:
Java:
public DrawView(Context c,AttributSet a) {
}

Doku hat gesagt.:
public View (Context context, AttributeSet attrs)

Since: API Level 1
Constructor that is called when inflating a view from XML. This is called when a view is being constructed from an XML file, supplying attributes that were specified in the XML file. This version uses a default style of 0, so the only attribute values applied are those in the Context's Theme and the given AttributeSet.
 
Oh, super!
Vielen Dank!

Jetzt wird die canvas dargestellt.

Aber leider nicht unter dem TextView, so wie im RelativeLayout angegeben...
[XML]android:layout_below="@+id/txv"[/XML]

Es sollte unter dem Text erscheinen.
Statt dessen erscheint es als einziges und am oben auf dem Bildschirm.
 
Versuch es doch mal über den GUI-Editor zu positionieren. Sonst arbeite ich immer mit der XML, aber beim RelativeLayout greife ich gerne auf den GUI-Editor zurück, der ist eigentl. ziemlich gut.
 
Es wird im GUI-Editor richtig dargestellt,
nur leider nicht auf dem Endgerät und auch nicht auf dem virtual device,
nicht mal das margin_top 50dp.

gui_edit01.bmp
 
Zuletzt bearbeitet von einem Moderator:
Jetzt hab ich's!!!

Aus der MainActivity.java
musste ich
Java:
setContentView(drawView);
löschen.

Auf ins Wochenende! 🙂
 

Zurück
Oben