Android Bewegung auf dem Display nachzeichnen ohne Canvas.path zu verwenden

H

HeroUser96

Ambitioniertes Mitglied
2
Hallo zusammen!
Wie der Titel schon sagt, möchte ich gerne in meiner App eine Linie zeichnen lassen, die genau der Bewegung folgt, die der User mit dem Finger auf dem Display vollführt.
Normalerweise würde man die Bewegung einfach mithilfe eines Paths zeichnen lassen, die Möglichkeit hab ich auch schon ausproniert, sie scheidet bei mir aber aus anderen Gründen aus.

Deshalb suche ich nach Alternativen und bin hier auf eine gestoßen. In diesem Beispiel wird eine Funktion gezeichnet, indem verschiedene Punkte definiert werden, zwischen denen dann mit Canvas.drawLines einzelne Linien gezeichnet werden.
(Ich kann, wenn es weiterhilft, den Code auch hier posten, ich denke aber das der aus dem Zusammenhang gerissen ziemlich komplex und unübersichtlich ist).

Nun Möchte ich diese Methode anwenden, um eben meine gewünschte Linie zu zeichnen.
Ich hab dazu zunächst versucht, in der onTouch-Methode die Punkte zu speichern, die gezeichnet werden sollen und sie dann später zu verbinden.
Allerdings klappt das alles nicht so wie gewollt (d.h, im Moment wird gar nichts gezeichnet)
Ich wäre für alle Ideen sehr dankbar
 
Was ist den genau das Problem? Code und Logtrace würden schon helfen.

Oder möchtest du eine fertige Lösung? ;)
 
Okay, also hier ist mal der code:

Code:
private void drawDataSeriesUnclipped(Canvas canvas) {
        mSeriesLinesBuffer[0] = mContentRect.left;
        mSeriesLinesBuffer[1] = getDrawY(fun(mCurrentViewport.left));
        mSeriesLinesBuffer[2] = mSeriesLinesBuffer[0];
        mSeriesLinesBuffer[3] = mSeriesLinesBuffer[1];
        float x;
        for (int i = 1; i <= DRAW_STEPS; i++) {
            mSeriesLinesBuffer[i * 4 + 0] = mSeriesLinesBuffer[(i - 1) * 4 + 2];
            mSeriesLinesBuffer[i * 4 + 1] = mSeriesLinesBuffer[(i - 1) * 4 + 3];

            x = (mCurrentViewport.left + (mCurrentViewport.width() / DRAW_STEPS * i));
            mSeriesLinesBuffer[i * 4 + 2] = getDrawX(x);
            mSeriesLinesBuffer[i * 4 + 3] = getDrawY(fun(x));
        }
        canvas.drawLines(mSeriesLinesBuffer, mDataPaint);
    }

protected static float fun(float x) {
        return (float) Math.pow(x, 3) - x / 4;
    }

In dem Beispiel oben, wird also die vordefinierte Funktion fun gezeichnet.
Ich möchte jetzt aber eben nicht diese vorher errechnete Funktion zeichnen lassen, sondern einfach die "Funktion" (also im Prinzip nur eine Linie) die eben der Benutzer zeichnet.
Meine Idee:
Ähnlich wie bei der oben genannten Funktion, die jedem x-Wert einen passenden y-Wert zuordnet und diesen dann zurückgibt (return (float) Math.pow(x, 3) - x / 4;), soll nun eben zu jedem x-wert der passende y-wert geliefert werden, der auch tatsächlich berührt wurde. Da man dies ja nicht mathematisch berechnen kann (man weiß ja nicht wie der Benutzer seinen Finger bewegen wird) habe ich zunächst die Punkte, die der User berührt, in einer ArrayList gespeichert und dann die Funktion so verändert:
Code:
   protected static float fun(float x) {

        float currX = 0;
        float currY = 0;

        for (int i = 0; i < pointsList.size(); i++) {
            Point curr = pointsList.get(i);
            currX = curr.x;
            currY = curr.y;
        }

        if (currX == x) {
            return currY;
        }

Im Prinzip wollte ich also die lange Liste an Punkten, die berührt wurden, nach dem x-Wert durchsuchen und dann den dazu passenden y-Wert zurückgeben lassen.
Allerdings wird bei dem Ansatz so im Moment gar nichts gezeichnet.
Ich hoffe das hilft beim Verständnis!

(Was ich bereits überprüft habe:
- die ArrayList ist nicht leer, es gibt einige Punkte und sie scheinen auch korrekt zu sein
- die if()-Bedingung wird erfüllt wenn die werte tatsächlich übereinstimmen)
 
Wenn ich dich recht verstehe speicherst du in der List die x und y Werte der verschiedenen Positionen des Fingers.

Und du suchst eine Funktion y = f(x). Das sehr viel mathematische Overheat, für ein Ergebnis, dass du schon hast. Alle x und y Werte sind bekannt.

Benutzte die Methode: drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
Code:
private void drawDataSeriesUnclipped(Canvas canvas) {

    int max = list.size() -1;
    for(i=0;i<max; i++){
       Point a = list.get(i);
       Point b = list.get(i+1)
       canvans.drawLine(a.x,a.y,b.x,b.y,mDataPaint);
    }
}
Hoffe es hilft.
 
Vor allem ist die Bewegung eines Fingers nicht als y=f(x) darstellbar. Der User kann schließlich Schleifen malen, d.h. zu einem x kann es mehrere y geben.
 

Ähnliche Themen

B
Antworten
4
Aufrufe
495
bb321
B
M
Antworten
4
Aufrufe
1.173
swa00
swa00
M
  • MikelKatzengreis
Antworten
5
Aufrufe
132
swa00
swa00
Zurück
Oben Unten