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

これは、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

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。これが無限にぐるぐる回ります。そのため、いくつかの調整が必要です。

于 2013-03-29T11:51:59.653 に答える
0

私の目的では、のCanvas代わりに使用するのが最適なソリューションであることがわかりましたImageView画像の回転には、ここにある別のライブラリを使用することにしました

于 2013-05-09T07:18:58.027 に答える
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 に答える