Rect zeichnen

Hallo
Ich will bei meinem View ein rect auf eine position setzen,doch wenn die Position grösser ist als 100 wird’s nicht mehr angezeigt
Activity

package ding.din.di;

import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.view.TouchDelegate;
import android.text.method.*;
import android.view.View.*;
import android.content.pm.*;
import android.graphics.Point;

public class MainActivity extends Activity
{
	KBView v;
 
    @Override
    public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
		WindowManager.LayoutParams.FLAG_FULLSCREEN);
		v = new KBView(this, this);
		setContentView(v);
			
				
}

View

package ding.din.di;

import android.view.View;
import android.graphics.*;
import android.util.AttributeSet;
import android.content.Context;
import android.app.*;
import android.widget.*;
import android.util.*;

public class KBView extends View
{
	Canvas canvas;
	Paint p;
	Paint textp;
	Bitmap bitmap;
	boolean ding;
	int rectx = 100;
	int recty = 50;
    int w;
	int h;
	
	public KBView(Activity c, MainActivity ma){
		super(c);
		DisplayMetrics dm = new DisplayMetrics();
		ma.getWindowManager().getDefaultDisplay().getMetrics(dm);
		w = dm.widthPixels;
		h = dm.heightPixels;
		this.onMeasure(w, h);
		p = new Paint();
		textp = new Paint();
		textp.setTextSize(50);
		bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
		canvas = new Canvas(bitmap);
	}
	
	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh)
	{
		super.onSizeChanged(w, h, oldw, oldh);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
	{
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		setMeasuredDimension(w, h);
	}
	
	@Override
	protected void onDraw(Canvas c)
	{
		super.onDraw(c);
		c.drawBitmap(bitmap, 0, 0, p);
		repaint();
	}
	public void repaint(){
		p.setColor(Color.GREEN);
		canvas.drawRect(rectx,recty,100,100, p);
		textp.setColor(Color.RED);
		canvas.drawText("Hallo "+canvas.getWidth()+" "+canvas.getHeight()+" "+this.getWidth()+" "+getHeight(), 50, 50, textp);
		invalidate();
	}
}

Ist eine Weile her, aber im Deinem Code geht es wohl etwas drunter und drüber.

Wofür das Canvas “canvas”? Wenn ich es richtig sehe wird es nirgends verbaut.
Warum nutzt Du nicht das Canvas der View und zeichnest das Rechteck darauf?

Auch unschön - evtl. sogar problematisch - der Aufruf von “invalidate” innerhalb der onDraw Methode. Mit dem Aufruf von invalidate() soll ja das Neuzeichnen und somit der systemseitige Aufruf von onDraw angestoßen werden.

Ich bin neu beim Android programmieren, hab vorher nur mit dem PC gearbeitet.
Wenn ich das Canvas aus der Methode benutze wird nichts angezeigt und das invalidate hab ich auch gestrichen

Wenn ich mir den Code

und dazu die API Doku der Methode drawRect anschaue
void android.graphics.Canvas.drawRect(float left, float top, float right, float bottom, Paint paint)
Könnt man vermuten, das die Methode keine „negativen“ Rechtecke zeichnet? Ausprobiert habe ich es nicht. Aber das ist ja auch nicht gewünscht.

Heißt also um ein Rechteck mit Seitenlänge 100 an Position x, y zu zeichnen, muss der Code wie folgt heißen:
==> drawRect (x, y, x +100, y +100, paint)

Das Zeichnen eines einfachen Rechtecks auf einer View sollte dann in etwa so aussehen:

		super.onCreate(savedInstanceState);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
		requestWindowFeature(Window.FEATURE_NO_TITLE);

		final Paint paint = new Paint();
		paint.setColor(Color.RED);
		paint.setAntiAlias(true);

		final Point point = new Point(150, 200);

		View view = new View(this) {
			public void onDraw(Canvas canvas) {
				canvas.drawRect(point.x, point.y, point.x +100, point.y +100, paint);
			}
		};

		setContentView(view);
	}```

Auch unschön - evtl. sogar problematisch - der Aufruf von “invalidate” innerhalb der onDraw Methode. Mit dem Aufruf von invalidate() soll ja das Neuzeichnen und somit der systemseitige Aufruf von onDraw angestoßen werden.