ImageView旋转而不重新创建位图

时间:2013-03-29 11:45:01

标签: java android matrix bitmap android-imageview

我想旋转ImageView图像。这是我的代码:

Matrix mat = new Matrix();
mat.preRotate(90, ivImage.getWidth()/2, ivImage.getHeight()/2);
ivImage.setScaleType(ScaleType.MATRIX);
ivImage.setImageMatrix(mat);

但是当我点击旋转按钮时,不仅图像会旋转,而且它也会缩放,因为位图比ImageView大。

我知道我可以使用

b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), mat, true);
ivImage.setImageBitmap(b);

但这显然较慢,并且有一些滞后。

所以我的问题是:如何旋转图像而不进行缩放而不重新创建位图?

6 个答案:

答案 0 :(得分:3)

以下是我用于将图像旋转到90度的代码。

         if(oldAngle == 0){
              newAngle = oldAngle + 90;
            }
            else if(oldAngle == 90)
                newAngle = oldAngle - 90;
              LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
              int centerX = layoutParams.leftMargin + (view.getWidth()/2);
              int centerY = layoutParams.topMargin + (view.getHeight()/2);
              RotateAnimation animation = new RotateAnimation(oldAngle, newAngle, centerX, centerY);
              animation.setDuration(0);
              animation.setRepeatCount(2);
              animation.setFillAfter(true);
              view.startAnimation(animation);

              oldAngle = newAngle;

希望它能帮到你......

答案 1 :(得分:0)

如何使用XML动画?

<?xml version="1.0" encoding="utf-8"?>
    <rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="1000"
    android:startOffset="0"
    android:repeatCount="infinite"
    />

然后使用类似的东西;

 rotation = AnimationUtils.loadAnimation(this, R.anim.clockwise_rotation);
 buttonRefresh.startAnimation(rotation);

PS。这无限旋转。所以需要一些调整。

答案 2 :(得分:0)

使用此

final Random generator = new Random();
        int n = 10000;
        n = generator.nextInt(n);
        final Matrix mtx = new Matrix();
        mtx.postRotate(n);
        rotator = Bitmap.createBitmap(all, 0, 0,
                all.getWidth(), all.getHeight(), mtx,
                true);
        view.setImageBitmap(rotator);

这将随机旋转图像。只需将.nextInt(n)更改为.nextInt(AnyNumberYouLife) 它快:):

答案 3 :(得分:0)

我发现,就我的目的而言,这是使用Canvas代替ImageView的最佳解决方案。为了旋转图像,我选择使用另一个可以找到的库here

答案 4 :(得分:0)

这是一个很好的解决方案,可以为imageView放置一个旋转的drawable:

Drawable getRotateDrawable(final Bitmap b, final float angle) {
    final BitmapDrawable drawable = new BitmapDrawable(getResources(), b) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, b.getWidth() / 2, b.getHeight() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
    return drawable;
}

用法:

Bitmap b=...
float angle=...
final Drawable rotatedDrawable = getRotateDrawable(b,angle);
root.setImageDrawable(rotatedDrawable);

另一种选择:

private Drawable getRotateDrawable(final Drawable d, final float angle) {
    final Drawable[] arD = { d };
    return new LayerDrawable(arD) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, d.getBounds().width() / 2, d.getBounds().height() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
}

另外,如果你想旋转位图,但是害怕OOM,你可以使用我做过的NDK解决方案here

答案 5 :(得分:0)

我发现旋转ImageView的最简单方法是执行此操作:

view.animate().rotationBy(degrees);

非常容易实现,android处理所有其余的

希望这有帮助! :)