我希望我的指南针像这样旋转
但我的结果是:
指南针在我的屏幕上到处都是......
我的问题在哪里?这是我的compass.java代码:
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GRAY);
int w = canvas.getWidth();
int h = canvas.getHeight();
int cw = w / 2;
int ch = h / 2;
Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.compass);
canvas.translate(cw, ch);
if (mValues != null) {
canvas.rotate(-mValues[0]);
}
int cx = (mWidth - myBitmap.getWidth()) / 2;
int cy = (mHeight - myBitmap.getHeight()) / 2;
canvas.drawBitmap(myBitmap, cx, cy, null);
}
p.s。:我很抱歉这些不好的照片,但我真的不知道如何用英语解释我的问题!谢谢
答案 0 :(得分:0)
由于您已经转换到画布的中心,因此您可能只需要将指南针的半宽/高度偏移以使其居中。尝试:
int cx = -myBitmap.getWidth() / 2;
int cy = -myBitmap.getHeight() / 2;
canvas.drawBitmap(myBitmap, cx, cy, null);
另外,为了获得良好的转换(翻译,旋转),请阅读OpenGL Red book chapter 3,特别是思考转换部分。虽然这是关于OpenGL的,但您也可以将这些知识用于非OpenGL转换。
编辑:
以乌龟逻辑思考。您的第一次翻译会将铅笔带到画布的中心。旋转会旋转你的铅笔。所以现在你可以将指南针精确地绘制在铅笔所在的位置(没有偏移),除了绘制指南针图像是从它的左上角开始而不是从它的中心开始。因此,您需要(-compassWidth / 2,-compassHeight / 2)的最后一次转换。请注意,此转换已经发生在旋转的x& y轴。另请注意,如果手动将该转换应用于画布本身,则可以在drawBitmap中为cx / cy传递0/0。
所以完整的序列是:转换为画布中心,旋转,平移否定为图像中心。
答案 1 :(得分:0)
不要在onDraw中解码位图 - 在创建视图时重复使用Bitmap。
创建一个矩阵并matrix.postRotate(mValues[0], half_width_of_bitmap, half_height_of_bitmap);
和matrix.postTranslate(cw, ch);
使用canvas.drawBitmap(bitmap, matrix, null);