Es gibt etwas, das ich inhere vermisse, so hoffe ich, dass Sie etwas Licht auf mich teilen können.Ziehen gedrehten Text in Android-Canvas funktioniert nicht wie erwartet
Ich zeichne etwas Text in Canvas. Dazu habe ich eine Klasse Word
public class Word {
private int x;
private int y;
private String text;
}
Die App der Benutzer den Text zu drehen erlaubt, und ich übernehmen die Rotation withing onDraw
protected void onDraw(Canvas canvas) {
canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.rotate(angle, centerX, centerY)
...
canvas.drawText(word.getText(), word.getX(), word.getY())
....
canvas.restore();
}
Das Problem, das ich bekommen ist, wenn der Benutzer die Leinwand zieht und Es gibt einen Rotationssatz. Wenn der Winkel = 0 ist, läuft die Bewegung wie erwartet.
@Override
public boolean onTouchEvent(MotionEvent event) {
case MotionEvent.ACTION_DOWN:
initialX = (int) event.getX();
initialY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int currentX = (int) event.getX();
int currentY = (int) event.getY();
int xMovement = currentX - initialX;
int yMovement = currentY - initialY;
dragWords(xMovement, yMovement);
.....
und auf dragWords
für jedes Wort, das ich tun:
private void dragText(int xMovement, int yMovement){
for (Word word : words) {
word.setX(word.getX() + xMovement);
word.setY(word.getY() + yMovement);
}
invalidate();
}
Wenn Drehwinkel 0,/Bewegen nach oben nach unten/links/rechts macht die Worte um die gleiche Strecke bewegen . Wenn der Winkel größer wird, beginnen sich die Wörter in verschiedenen Richtungen zu bewegen, zum Beispiel bei 60 beginnt sie diagonal nach oben zu gehen, bei 180 bewegt sie sich nur nach oben/unten und nicht nach links/rechts.
Ich denke, ich muss eine Art von einem Unterschied basierend auf Winkel berechnen und es zu xMovement/yMovement hinzufügen ... aber wie soll ich das tun?
LE: Hier ist ein Bild, wie es sich verhält: Die blauen Linien sind, wie der Text auf Drag bewegt, während die orange der Finger auf dem Bildschirm bewegen. Wenn der Winkel 0 ist, funktioniert er ziemlich gut, wenn der Winkel zunimmt, beginnt er, sich diagonal nach links/rechts zu bewegen, während er, wenn der Winkel noch größer ist, nur nach oben und unten bewegt wird und nicht auf links/rechts reagiert
Ich sehe wirklich nicht den Unterschied zwischen dieser Lösung und das Wesentliche habe ich gepostet (?) – matiash
Es ist in der Tat der gleiche Ansatz, es war nur ein bisschen einfacher, nur auf Matrix mit -global – Alin
@matiash Ich gab nur das Wesentliche Sie einen Probe-Lauf geschrieben - funktioniert gut, außer einem nicht verwandten Problem (nicht wichtig). Die Sache ist, ich ging deine Antwort durch und sah, dass 'Alin' keinen Erfolg damit hatte. Also habe ich selbstständig mit der Idee codiert, dass die Rotation neutralisiert werden muss (unter Verwendung der Negation des Rotationswinkels). – Vikram