java - 在 android canvas 中拖动旋转文本无法按预期工作

标签 java android geometry android-canvas trigonometry

我在这里缺少一些东西,所以我希望你能分享一些关于我的信息。

我正在 Canvas 中绘制一些文本。为此,我有一个类 Word

public class Word {
     private int    x;
     private int    y;
     private String text;
}

该应用允许用户旋转文本,我使用 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();
}

我遇到的问题是当用户拖动 Canvas 并且存在旋转集时。当 angle=0 时,运动按预期进行。

@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);
   .....

dragWords 上我做的每个词:

private void dragText(int xMovement, int yMovement){
for (Word word : words) {
    word.setX(word.getX() + xMovement);
    word.setY(word.getY() + yMovement);
}
invalidate();

当旋转角度为0时,上/下/左/右移动使文字移动相同的距离。随着角度变大,文字开始向不同的方向移动,例如在 60 时,它开始沿对角线向上移动,当 180 时,它只向上/向下移动,而不是向左/向右移动。

我想我需要根据角度计算某种差异并将其添加到 xMovement/yMovement...但我应该怎么做?

LE:这是一张关于它如何表现的图片: enter image description here 蓝线是文本在拖动时的移动方式,而橙色是手指在屏幕上拖动的方式。当角度为0时效果很好,当角度增加时,它开始向左/右倾斜移动,而当角度更大时,它只上下移动,不响应左/右

最佳答案

如果我理解正确,问题是 Canvas.rotate() 不仅旋转文本方向,而且整个 Canvas 。因此,单词的 x-y 坐标也从指定的轴心点旋转。

为了配合拖动 Action ,可以使用Matrix为此,更具体地说 inverse matrix您用来旋转 Canvas 的那个。它将用于将单词的 x-y 坐标转换为其原始的旋转前位置。

例如,计算一次,并在 anglecenterXcenterY 发生变化时更新它。

// rotMatrix is the same operation applied on the canvas.
Matrix rotMatrix = new Matrix();
rotMatrix.postRotate(mAngle, centerX, centerY);

// Invert it to convert x, y to their transformed positions.
Matrix matrix = new Matrix();
rotMatrix.invert(matrix);

然后,在绘制每个单词时:

int wordX = ... 
int wordY = ...
String text = ...

float[] coords = new float[] { wordX, wordY };
matrix.mapPoints(coords);
canvas.drawText(text, coords[0], coords[1], paint);

关于java - 在 android canvas 中拖动旋转文本无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24938994/

相关文章:

java - Jasper报表在数据较多时以PDF格式导出空数据

java - 启动 Hadoop 集群时出错

java - 在 Minecraft bukkit 插件中构建金字塔

c++ - 在多边形内绘制横截面线

math - 圆和三角形问题

java - 使用方向键遍历 JMenuBar 时跳过禁用的 JMenu

java - 从未确定的子类到父类(super class)的转换

android - eclipse 中没有 google API 构建目标?

java - 带有 PendingIntent.getService 的 startForeground 通知错误?

Android outputStream.write 发送多条消息