2010-12-16 19 views
2

Ich würde gerne wissen, wenn es möglich ist, Koordinaten aus einem Pfad auszuwählen, um eine Bitmap im Laufe der Zeit zu zeichnen, zum Beispiel habe ich ein Bild von einer Sonne, und ich möchte es im Laufe der Zeit entlang eines Bogenweges verschieben.Android, Bitmap entlang eines Pfades verschieben?

Gibt es eine Möglichkeit, einen Pfad wie diesen zu definieren und ihn dann zu durchlaufen, so dass ich ihn nicht mathematisch berechnen muss?

Danke.

+0

Diese Frage ist jetzt 5 Jahre alt und ich sehe immer noch Antworten. – Hamid

+0

Diese Frage ist jetzt 5 Jahre alt und ich sehe immer noch Antworten. Ich bin älter und, nun, älter jetzt und persönlich, ich würde dies jetzt mit einer Sinuskurve tun. (Math.sin()). Zwischen 0 und Pi rads würden Sie 180 Grad geben, oder Sie können die X- und Y-Werte multiplizieren oder dividieren, um breitere/engere Bögen zu erhalten, aber das ist alles grundlegende Mathematik der Sinuswellen. Erhöhen/loopen Sie die Werte in einem Timer oder in Ihrer Zeichenschleife. (Verwenden Sie Float-Werte gegen die Zeit in Millis, um weiche Bewegungen zu erzielen, indem Sie für jeden Frame einen Bruchteil eines Pixels bewegen) – Hamid

Antwort

2

Ich denke an eine Lösung:

  _ 
    / \ 

Wenn Ihr Bogen um diese Art von Form hat (was bedeutet, weniger als die Hälfte einen Kreis und positioniert horizontaly), dann können Sie den x-Wert durchlaufen und Dafür erhält man das y, das auf dem Weg ist. Dann verschieben Sie Ihre Bitmap an diese Position.

+0

So habe ich es implementiert. Wat, auf das ich gehofft hatte, war ein Pfadfeature wie iOS, aber es scheint, dass es nicht verfügbar ist. – Hamid

+0

Nun, da ich nachdenke und ich habe ein wenig darüber recherchiert, bin ich neugierig: Wie hast du den Punkt bei einem bestimmten x-Wert bekommen, der auf dem Weg ist? –

+0

Ich landete nur in mehreren geraden Linien, die eine Kurve oder ein anderes Muster bilden. Also, 3 gerade Zeilen im Fall von dir ASCII-Art oben. – Hamid

10

Ja, es ist möglich, das Bild entlang des Pfades zu verschieben. Ich werde einfache Lösung zur Verfügung stellen, um das Prinzip zu zeigen. Der folgende Code wird Ihr Bild verschieben und drehen. Wenn Sie keine Rotation benötigen, entfernen Sie das TANGENT_MATRIX_FLAG-Flag.

import android.graphics.*; 
//somewhere global 
int iCurStep = 0;// current step 

//don't forget to initialize 
Path pathMoveAlong = new Path(); 
private static Bitmap bmImage = null; 

@Override 
protected void onDraw(Canvas canvas) { 
    Matrix mxTransform = new Matrix(); 
    PathMeasure pm = new PathMeasure(pathMoveAlong, false); 
    float fSegmentLen = pm.getLength()/20;//20 animation steps 

    if (iCurStep <= 20) { 
     pm.getMatrix(fSegmentLen * iCurStep, mxTransform, 
      PathMeasure.POSITION_MATRIX_FLAG + PathMeasure.TANGENT_MATRIX_FLAG); 
     canvas.drawBitmap(bmImage, mxTransform, null); 
     iCurStep++; 
     invalidate(); 
    } else { 
     iCurStep = 0; 
    }; 
}; 
+0

Hallo Eduard, könntest du noch mehr Code (Aktivität, Layout, etc ...) zur Verfügung stellen? Dies ist nicht genug für mich zu verstehen, wie es funktioniert. Vielen Dank im Voraus! – thomaus

+1

Würden Sie etwas Code mit einem echten Bild und einem echten Pfad senden? – thomaus

+0

Ok, ich habe es mit http://stackoverflow.com/questions/6154370/android-move-object-along-a-path – thomaus

4

Hier sind die Animateure ich benutze:

Zweck: View "Ansicht" Bewegen Sie sich entlang Pfad "Pfad"

v21 +:

ValueAnimator pathAnimator = ObjectAnimator.ofFloat(view, "x", "y", path) 

v11 +:

ValueAnimator pathAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); 

pathAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
float[] point = new float[2]; 

@Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     float val = animation.getAnimatedFraction(); 
     PathMeasure pathMeasure = new PathMeasure(path, true); 
     pathMeasure.getPosTan(pathMeasure.getLength() * val, point, null); 
     view.setX(point[0]); 
     view.setY(point[1]); 
    } 
}); 

Ähnliche Anforderung an: https://stackoverflow.com/a/30254715/4344057

Verwandte Themen