Wie zeichne ich eine Linie mit Canvas ?

znieh99

znieh99

Fortgeschrittenes Mitglied
12
Hallo Forum,
mir ist das Zusammenspiel zwischen View, Canvas und onDraw trotz stundenlangen lesen immer noch nicht klar. Darum möchte ich ganz einfach eine Linie mittels Canvas in einem View zeichnen.
Im nachstehender Code habe ich versucht das auf einfachste Weise (aus meiner Sicht) zu realisieren. Der Ablauf ist bis zur Methode "DrawLine.draw" zu verfolgen, dann passiert nichts mehr. Ich hoffe ihr könnt mir diese Zusammenhängen besser erklären,
lg Heinz
Code:
package com.example.heinz.testgraphic;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.LinearLayout;

import static android.graphics.Color.BLACK;

public class MainActivity extends AppCompatActivity {
    private LinearLayout mLayout;
    private DrawLine mDrawLine;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLayout =  (LinearLayout)findViewById(R.id.activity_main);
        mDrawLine = new DrawLine(this, null);
        mLayout.addView(mDrawLine);     // <-- wird das eine ansprechbare View ?
    }           //end onCreate -------------------------------------------

    /**
     * Reaktion auf Click Button
     * @param Button
     */
    public void onStartPaint(View Button) {
        mDrawLine.draw();
    }           //end onStartPaint ---------------------------------------

    /**
     * Diese Class zeichnet (hoffentlich)
     */
    protected  class DrawLine extends View {
        private Canvas mCanvas;     // <-- notwendig ?, wie mit onDraw verbinden ?
        /**
         * Constructor
         * @param context
         */
        public DrawLine(Context context, AttributeSet attrs) {  // <-- attr ist null, notwendig ?
            super(context, attrs);
        }           //end Constructor

        public void draw() {
            invalidate();           // <-- bis hierher kommt der Ablauf. und dann ?
        }           //end draw ----------------------------------------------

        @Override
        protected void onDraw(Canvas canvas) {
            Paint mPaint = new Paint();
            mPaint.setColor(BLACK);
            mPaint.setStrokeWidth(4);
            canvas.drawLine(10, 50, 100, 50, mPaint);
        }           //end onDraw ---------------------------------------------
    }           //end C DrawClass --------------------------------------------

}           //end C MainActivity ---------------------------------------------
Das zugehörige Layout:
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.heinz.testgraphic.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onStartPaint"
        android:text="@string/start_paint" />
</LinearLayout>
 
Hallo Heinz,

du vermischst noch Overrides, Funktionen und Klassen.

Du benötigst keine Klasse "DrawLine" du benötigst eine abgeleitete Klasse von View.

Und dieser View ist DEIN View, welches du verwendest/anzeigst.
Innerhalb dieses Views überschreibst du OnDraw und DARIN zeichnest du deine Linie

Besipiel

Code:
public class MyView extends View
{
  Paint paint = new Paint();

  @Override
  protected void onDraw(Canvas canvas)
  {
   paint.setAntiAlias(true);
   paint.setStrokeWidth(6f);
   paint.setColor(Color.BLACK);
   paint.setStyle(Paint.Style.STROKE);
   paint.setStrokeJoin(Paint.Join.ROUND);
   canvas.drawLine(startX, startY, stopX, stopY, paint);
  }
}




NACHTRAG :

In unserem Forum soll jeder Nutzer sofort erkennen können, um welche Frage es sich handelt.
Dafür bitten wir unsere User, ihre Frage aussagekräftig zu gestalten.

Ich habe mir erlaubt deinen ursprünglichen Text "Einfach mit Canvas zeichnen" so umzugestalten,
dass man jetzt auf dem ersten Blick ersehen kann, worum es geht .

Bitte sei so lieb und gestalte Deine nächsten Fragen ein wenig aussagekräftiger
[LEITFADEN] Wie bekomme ich die effektivste Hilfe ?

Danke
 
Zuletzt bearbeitet:
@swa00
Danke für die rasche Antwort.
Aber reicht es jetzt MyView aus der Main aufzurufen? Oder ist MyView die Main? Ich dachte onDraw() wird durch invalidate() aktiviert? Wie es aussieht wird die canvas vom System beigestellt?
Sorry, aber ich möchte nicht nur Code abschreiben, sondern auch verstehen,
lg Heinz
PS: Deine Betreff-Änderung ist sehr gut
 
@swa00
selbst wenn ich eine der beiden Varianten implementieren könnte (was ich nicht kann), weiß ich immer noch nicht wie ich MyView aufrufen kann.
Ich finde, du bist ein exzellenter Experte, aber deine Antwort ist nur ein Fragment welches ohne Kontext (zumindest für mich) nicht sehr hilfreich ist,
lg heinz
 
Hallo Heinz ,

weiß ich immer noch nicht wie ich MyView aufrufen kann.

Deshalb habe ich dir oben die beiden Links genannt.
Dort werden dir auch an Beispielen die Wege aufgezeigt, wie man Views verwendet.

Ohne auch dir zu nahe zu treten , das sind halt schon Beispiele aus dem Basis - Grundwissen.
Ich wüsste auch jetzt nicht wie weit ich noch mehr "runter" gehen könnte.
Würde dir aber natürlich gerne helfen

Ich denke , dass dir die Unterschiede von Layouts und Views noch nicht so ganz in
Fleisch und Blut übergegangen sind.
Im Prinzip sind alles Views - ob das ein Button oder nur ein grauer Kasten ist

Darf ich dich an dieser Stelle fragen , ob du schon fit in OOP bist ?
Objektorientierte Programmierung – Wikipedia

Das Beispiel was ich dir oben genannt habe ist eine klassische Standard-Vererbung eines Views.
Mehr eigentlich nicht

Und das kannst du wie einen Button verwenden
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: znieh99
@swa00
Ok, es läuft! Meine OOP Kenntnisse sind nicht die schlechtesten, ich habe in VB, Java und JavaScript schon etliche Programme realisiert. Mein Problem lag nicht so sehr beim Verständnis des Zusammenspiel der Komponenten sondern an der noch ungewohnten Umgebung und Bedienung des Editor. Fehlermeldungen die ich falsch interpretierte versperrten mir den logischen Weg.
Egal, jetzt bin ich wieder einen Schritt weiter und danke dir für deine Hinweise und deine Geduld.
In der Folge noch der funktionierende Code:
Code:
package com.example.heinz.testgraphic;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.LinearLayout;

import static android.graphics.Color.BLACK;
import static android.graphics.Color.RED;

public class MainActivity extends AppCompatActivity {
    private LinearLayout mLayout;       //Instanzvariable des Layout
    private DrawView mDrawView;         //Instanzvariable des View zum zeichnen
    private boolean isHorizontal;       //Merker für die Ausrichtung der Linie
    /**
     * Einstiegspunkt der App
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        isHorizontal = false;
            // View zum Zeichnen in das Layout einbinden
        mLayout =  (LinearLayout)findViewById(R.id.activity_main);
        mDrawView = new DrawView(this);
        mLayout.addView(mDrawView);
    }           //end onCreate -------------------------------------------
    /**
     * Der Button wurde geklickt, das Zeichnen der Linie wird eingeleitet
     * @param Button
     */
    public void onStartPaint(View Button) {
        mDrawView.invalidate();     //löst das onDraw in der Class DrawView aus
    }           //end onStartPaint ---------------------------------------
    /**
     * Diese Class definiert einen View in dem gezeichnet werden kann.
     * Sie muss in das Layout eingebunden werden (siehe onCreate)
     */
    public   class DrawView extends View {
        public DrawView(Context context) {
            super(context);
        }           //end Constructor
        /**
         * Diese überschriebene Methode ermöglicht das Zeichnen
         * Sie kann mit .invalidate() angestoßen werden
         * @param canvas
         */
        @Override
        protected void onDraw(Canvas canvas) {
            Paint mPaint = new Paint();     //das Zeichenwerkzeug
            mPaint.setAntiAlias(true);
            mPaint.setColor(RED);
            mPaint.setStrokeWidth(10f);
            int xs = 50;
            int ys = 50;
            int xe = 150;
            int ye = 50;
            if(isHorizontal) {
                xe = 50;
                ye = 150;
                isHorizontal = false;
            }
            else {
                xe = 150;
                ye = 50;
                isHorizontal = true;
            }
            canvas.drawLine(xs, ys, xe, ye, mPaint);
        }           //end onDraw ---------------------------------------------
    }           //end C DrawView ---------------------------------------------
}           //end C MainActivity ---------------------------------------------
 
Na das sieht doch richtig gut aus - Herzlichen Glückwunsch :)

und danke dir für deine Hinweise und deine Geduld.

Dafür sind wir da :)
 

Ähnliche Themen

L
Antworten
15
Aufrufe
909
jogimuc
J
M
Antworten
3
Aufrufe
172
moin
M
OnkelLon
Antworten
13
Aufrufe
1.988
OnkelLon
OnkelLon
Zurück
Oben Unten