1

我想旋转 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);

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

所以我的问题是:如何在不缩放且不重新创建位图的情况下旋转图像?

4

6 回答 6

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;

希望它会帮助你...

于 2013-03-29T11:52:47.950 回答
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);

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

于 2013-03-29T11:51:59.653 回答
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) 的快:)

于 2013-03-29T12:23:06.530 回答
0

我发现就我的目的而言,它是最好的解决方案,Canvas而不是ImageView. 对于图像的旋转,我选择使用可以在此处找到的另一个库

于 2013-05-09T07:18:58.027 回答
0

这是为 imageView 放置旋转可绘制对象的一个​​很好的解决方案:

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 解决方案

于 2014-01-27T08:30:16.430 回答
0

我发现旋转 ImageView 的最简单方法是这样做:

view.animate().rotationBy(degrees);

非常容易实现,其余的都由 android 处理

希望这可以帮助!:)

于 2015-02-09T17:01:17.050 回答