带位图的指南针将在屏幕中无处不在

时间:2011-11-16 10:38:52

标签: android

我希望我的指南针像这样旋转

enter image description here

但我的结果是:

enter image description here

指南针在我的屏幕上到处都是......

我的问题在哪里?这是我的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。:我很抱歉这些不好的照片,但我真的不知道如何用英语解释我的问题!谢谢

2 个答案:

答案 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);

绘制位图