Android: поворот изображения в режиме просмотра изображения на угол - PullRequest
140 голосов
/ 24 января 2012

Я использую следующий код для поворота изображения в ImageView на угол.Есть ли более простой и менее сложный метод.

ImageView iv = (ImageView)findViewById(imageviewid);
TextView tv = (TextView)findViewById(txtViewsid);
Matrix mat = new Matrix();
Bitmap bMap = BitmapFactory.decodeResource(getResources(),imageid);
mat.postRotate(Integer.parseInt(degree));===>angle to be rotated
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,bMap.getWidth(),bMap.getHeight(), mat, true);
iv.setImageBitmap(bMapRotate);

Ответы [ 21 ]

1 голос
/ 27 января 2014

вот отличное решение для размещения повернутой прорисовки для 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, которое я сделал здесь

1 голос
/ 21 декабря 2012

попробуйте это в пользовательском представлении

public class DrawView extends View {


    public DrawView(Context context,AttributeSet attributeSet){
        super(context, attributeSet);
    }

    @Override
    public void onDraw(Canvas canvas) {
        /*Canvas c=new Canvas(BitmapFactory.decodeResource(getResources(), R.drawable.new_minute1)    );

        c.rotate(45);*/

        canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.new_minute1), 0, 0, null);
        canvas.rotate(45);
    }
}

1 голос
/ 17 апреля 2019

Поворот изображения в Android с задержкой:

imgSplash.animate().rotationBy(360f).setDuration(3000).setInterpolator(new LinearInterpolator()).start();
1 голос
/ 08 февраля 2018

Если вы хотите повернуть вид только визуально, вы можете использовать:

iv.setRotation(float)
0 голосов
/ 25 января 2012

К сожалению, я не думаю, что есть. Класс Matrix отвечает за все манипуляции с изображениями, будь то вращение, сжатие / увеличение, наклон и т. Д.

http://developer.android.com/reference/android/graphics/Matrix.html

Мои извинения, но я не могу придумать альтернативы. Может быть, кто-то еще сможет, но когда мне приходилось манипулировать изображением, я использовал Матрицу.

Удачи!

0 голосов
/ 10 апреля 2015

без матрицы и анимации:

{
    img_view = (ImageView) findViewById(R.id.imageView);
    rotate = new RotateAnimation(0 ,300);
    rotate.setDuration(500);
    img_view.startAnimation(rotate);
}
0 голосов
/ 25 января 2012

Другим возможным решением является создание собственного настраиваемого представления изображения (скажем, RotateableImageView extends ImageView) ... и переопределение onDraw () для поворота холста / растровых изображений перед повторным отображением на холсте. Не забудьте восстановитьcanvas back.

Но если вы собираетесь вращать только один экземпляр изображения, ваше решение должно быть достаточно хорошим.

0 голосов
/ 09 февраля 2017

просто напишите это в свой onactivityResult

            Bitmap yourSelectedImage= BitmapFactory.decodeFile(filePath);
            Matrix mat = new Matrix();
            mat.postRotate((270)); //degree how much you rotate i rotate 270
            Bitmap bMapRotate=Bitmap.createBitmap(yourSelectedImage, 0,0,yourSelectedImage.getWidth(),yourSelectedImage.getHeight(), mat, true);
            image.setImageBitmap(bMapRotate);
            Drawable d=new BitmapDrawable(yourSelectedImage);
            image.setBackground(d); 
0 голосов
/ 12 августа 2018

Следуйте приведенному ниже ответу для непрерывного вращения изображения

int i=0;

Если нажать кнопку поворота

imageView.setRotation(i+90);
i=i+90;
0 голосов
/ 22 мая 2018

Вместо того, чтобы конвертировать изображение в растровое изображение, а затем повернуть его, попробуйте повернуть прямой просмотр изображения, как показано ниже.

ImageView myImageView = (ImageView)findViewById(R.id.my_imageview);

AnimationSet animSet = new AnimationSet(true);
animSet.setInterpolator(new DecelerateInterpolator());
animSet.setFillAfter(true);
animSet.setFillEnabled(true);

final RotateAnimation animRotate = new RotateAnimation(0.0f, -90.0f,
    RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
    RotateAnimation.RELATIVE_TO_SELF, 0.5f);

animRotate.setDuration(1500);
animRotate.setFillAfter(true);
animSet.addAnimation(animRotate);

myImageView.startAnimation(animSet);
...