在Android上无需缩小即可旋转图像

时间:2012-04-02 04:19:31

标签: java android image rotation

我需要在我正在处理的应用上创建指南针。所以我试图创建一个名为CompassView的新视图,它基本上扩展了imageview,显示了一个东西南北指向的位图,使用传感器查找手机指向的度数,并相应地旋转图像以便创建它一个真正的罗盘。但问题是,如果我尝试将图像旋转到某些角度(如45度),它会缩小。这里有一些图片可以更好地解释它。

This is normal

This is shrinked

正如你所看到的,当我试图在45左右旋转时,第二张图像会缩小。我想要它做的是: this

以下是我目前使用的代码:

        Bitmap bMap = BitmapFactory.decodeResource(getResources(),
                R.drawable.compass);
        Matrix xMatrix = new Matrix();
        xMatrix.reset();
        xMatrix.postRotate(360-mValue, 75, 75); //This is 75 because 150 is the image width
        Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,
                bMap.getWidth(), bMap.getHeight(), xMatrix, true);
        setImageBitmap(bMapRotate);

任何帮助将不胜感激。感谢

编辑:(解决方案) 由于接受了答案,我终于得到了它。以下是我想要知道它是如何工作的人使用的代码:

RotateAnimation rAnimAntiClockWise = new RotateAnimation(
                    360 - mValue, 360 - event.values[0],
                    Animation.RELATIVE_TO_SELF, 0.5f,
                    Animation.RELATIVE_TO_SELF, 0.5f);
//mValue is the angle in degrees and i subtracted it from 360 to make it anticlockwise, and event.values[0] is the same thing as mValue
rAnimAntiClockWise.setFillAfter(true);
rAnimAntiClockWise.setInterpolator(new LinearInterpolator());
rAnimAntiClockWise.setDuration(0);
startAnimation(rAnimAntiClockWise);

2 个答案:

答案 0 :(得分:4)

您可以使用另一种技巧,它与旋转相同,但不会调整图像大小。我实际上是以45度角旋转图像并在动画后保持变化。

rAnimAntiClockWise = new RotateAnimation(0.0f, 45.0f,
                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                0.5f);
        rAnimAntiClockWise.setFillAfter(true);
        rAnimAntiClockWise.setInterpolator(new LinearInterpolator());       
            bitmap = BitmapFactory.decodeResource(getResources(),
                    R.drawable.rotate);     
        rAnimAntiClockWise.setDuration(100);
        img_rotate.startAnimation(rAnimAntiClockWise);

答案 1 :(得分:3)

问题是你的新图像实际上更大,因为光源的角落“伸出”,因此视图会缩小以适应。

一些可能的方法:

  1. 完成上述代码后,请调用Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height),复制正确大小的中心区域。很容易得到你的代码,但创建一个无用的中间位图。

  2. 不是将变换和源图像赋予createBitmap,只需创建一个正确大小的可变位图,将其包装在Canvas中,然后告诉Canvas渲染旋转的图像。

    bMapRotate = Bitmap.createBitmap(
        bMap.getWidth(), bMap.getHeight(), bMap.getConfig());
    Canvas canvasRotate = new Canvas(bMap);
    canvasRotate.drawBitmap(bMap, xMatrix, paint); // any opaque Paint should do
    
  3. 保留您拥有的代码,但在渲染时告诉视图裁剪而不是缩放。