我目前正在开发一款带有绘图表面的Android应用程序,我想在其上绘制位图。在绘制到绘图表面之前,我使用Canvas向用户显示位图。
我的问题如下: 我正在尝试使用从onTouch()调用的handleMove函数实现旋转。以下代码计算旋转角度:
private void rotate(float deltaX, float deltaY) {
if (mDrawingBitmap == null) {
return;
}
PointF currentPoint = new PointF(deltaX + mPreviousEventCoordinate.x,
deltaY + mPreviousEventCoordinate.y);
double previousXLength = mPreviousEventCoordinate.x - mToolPosition.x;
double currentXLength = currentPoint.x - mToolPosition.x;
double previousYLength = mPreviousEventCoordinate.y - mToolPosition.y;
double currentYLength = currentPoint.y - mToolPosition.y;
double deltaAngle = Math.atan2(currentXLength / previousYLength, currentYLength / currentYLength);
mBoxRotation = (float) (deltaAngle * 180 / Math.PI);
}
此处deltaX和deltaY是用户在屏幕上移动手指的移动距离。 mToolPosition是画布的中心。
private void drawBitmap(Canvas canvas) {
Paint bitmapPaint = new Paint(Paint.DITHER_FLAG);
canvas.save();
canvas.clipRect(new RectF(-mBoxWidth / 2, -mBoxHeight / 2,
mBoxWidth / 2, mBoxHeight / 2), Op.UNION);
canvas.drawBitmap(mDrawingBitmap, null, new RectF(-mBoxWidth / 2, -mBoxHeight / 2,
mBoxWidth / 2, mBoxHeight / 2), bitmapPaint);
canvas.restore();
}
此代码用于将位图绘制到旋转的画布上。就在调用drawBitmap(canvas)之前,我使用canvas.rotate(mBoxRotation)
旋转画布。
我的问题是如果旋转画布使得画布的左上角具有比位图中心更大的y坐标,则位图翻转180°。这意味着它不能连续旋转360° 是否有机会忽略位图的方向,使其不会翻转?
编辑:
此图像显示位图向右旋转约100°
如果我将它向右旋转更多,就会发生这种情况。因此,在大约130°时,图像会翻转,因为顶部是底部,底部现在是顶部。