Android: поворот изображения в режиме просмотра изображения под углом

Я использую следующий код для поворота изображения в 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);

Ответ 1

Еще один простой способ повернуть ImageView:
UPDATE:
Требуемый импорт:

import android.graphics.Matrix;
import android.widget.ImageView;

Код: (Предполагая ImageView, angle, pivotX и pivotY уже определены)

Matrix matrix = new Matrix();
imageView.setScaleType(ImageView.ScaleType.MATRIX);   //required
matrix.postRotate((float) angle, pivotX, pivotY);
imageView.setImageMatrix(matrix);

Этот метод не требует создания нового растрового изображения каждый раз.

ПРИМЕЧАНИЕ. Чтобы повернуть ImageView в ontouch во время выполнения, вы можете установите onTouchListener на ImageView и поверните его, добавив последние два строки (т.е. матрицу postRotate и установить ее на imageView) в приведенном выше коде раздел в части вашего ACTION_MOVE слушателя прикосновений.

Ответ 2

mImageView.setRotation(angle) с API >= 11

Ответ 3

Если вы поддерживаете API 11 или выше, вы можете просто использовать следующий атрибут XML:

android:rotation="90"

Он может отображаться некорректно в предварительном просмотре Android Studio xml, но он работает так, как ожидалось.

Ответ 4

Есть два способа сделать это:

1 С помощью Matrix создайте новое растровое изображение:

imageView = (ImageView) findViewById(R.id.imageView);
Bitmap myImg = BitmapFactory.decodeResource(getResources(), R.drawable.image);

Matrix matrix = new Matrix();
matrix.postRotate(30);

Bitmap rotated = Bitmap.createBitmap(myImg, 0, 0, myImg.getWidth(), myImg.getHeight(),
        matrix, true);

imageView.setImageBitmap(rotated);

2 используйте RotateAnimation на View, который вы хотите повернуть, и убедитесь, что анимация установлена ​​на fillAfter=true, duration=0 и fromDegrees=toDgrees

 <?xml version="1.0" encoding="utf-8"?>
<rotate
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:fromDegrees="45"
  android:toDegrees="45"
  android:pivotX="50%"
  android:pivotY="50%"
  android:duration="0"
  android:startOffset="0"
/>

и раздуйте анимацию в коде:

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
myView.startAnimation(rotation);

Ответ 5

Я знаю, что это безумно поздно, но это было полезно для меня, чтобы оно могло помочь другим.

Начиная с API 11, вы можете установить абсолютное вращение ImageView программно с помощью метода imageView.setRotation(angleInDegrees);.

Абсолютно, я имею в виду, что вы можете неоднократно вызывать эту функцию без необходимости отслеживать текущее вращение. Значение, если я повернусь, пройдя 15F к методу setRotation(), а затем снова вызовите setRotation() с помощью 30F, вращение изображения будет на 30 градусов, а не на 45 градусов.

Примечание.. Это действительно работает для любого подкласса объекта Вид, а не только для ImageView.

Ответ 6

Это моя реализация RotatableImageView. Использование очень просто: просто скопируйте attrs.xml и RotatableImageView.java в свой проект и добавьте RotatableImageView в свой макет. Установите желаемый угол поворота, используя пример: параметр угла.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:example="http://schemas.android.com/apk/res/com.example"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.example.views.RotatableImageView
        android:id="@+id/layout_example_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_layout_arrow"
        example:angle="180" />
</FrameLayout>

Если у вас есть проблемы с отображением изображения, попробуйте изменить код в методе RotatableImageView.onDraw() или используйте метод draw().

Ответ 7

У меня есть решение этого. На самом деле это решение проблемы, возникающей после вращения (прямоугольное изображение не соответствует ImagView), но оно также покрывает вашу проблему. Хотя это решение имеет анимацию лучше или хуже

    int h,w;
    Boolean safe=true;

Получение параметров imageView невозможно при инициализации активности. Для этого обратитесь к этому решению или установите размеры на кнопке onClick.

    rotateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(imageView.getRotation()/90%2==0){
                h=imageView.getHeight();
                w=imageView.getWidth();

            }
        .
        .//Insert the code Snippet below here 
       }

И код, который нужно запустить, когда мы хотим повернуть ImageView

if(safe)     
imageView.animate().rotationBy(90).scaleX(imageView.getRotation()/90%2==0?(w*1.0f/h):1).scaleY(imageView.getRotation()/90%2==0?(w*1.0f/h):1).setDuration(2000).setInterpolator(new LinearInterpolator()).setListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {
                      safe=false;
                }

                @Override
                public void onAnimationEnd(Animator animation) {
                      safe=true;

                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            }).start();
        }
    });

Это решение достаточно для проблемы выше. Хотя она будет уменьшать изображение, даже если это не обязательно (когда высота меньше ширины). Если это вас беспокоит, вы можете добавить еще один тернарный оператор внутри scaleX/scaleY.

Ответ 8

Я думаю, что лучший способ :)

int angle = 0;
imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            angle = angle + 90;
            imageView.setRotation(angle);
        }
    });

Ответ 9

Кроме того, если вы хотите повернуть ImageView на 180 градусов по вертикали или горизонтали, вы можете использовать свойства scaleY или scaleX и установить для них значение -1f. Вот пример Kotlin:

imageView.scaleY = -1f
imageView.scaleX = -1f

Значение 1f используется для возврата ImageView в его нормальное состояние:

imageView.scaleY = 1f
imageView.scaleX = 1f

Ответ 10

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

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);
    }
}

Ответ 11

здесь хорошее решение для поворота с возможностью поворота для изображения:

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, которое я сделал здесь

Ответ 12

просто напишите это в своем 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); 

Ответ 13

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

iv.setRotation(float)

Ответ 15

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

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

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

Удачи!

Ответ 16

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

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

Ответ 17

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

{
    img_view = (ImageView) findViewById(R.id.imageView);
    rotate = new RotateAnimation(0 ,300);
    rotate.setDuration(500);
    img_view.startAnimation(rotate);
}

Ответ 18

Попробуйте этот код 100% работать;

На кнопке поворота нажмите этот код:

        @Override
        public void onClick(View view) {
            if(bitmap==null){
                Toast.makeText(getApplicationContext(), "Image photo is not yet set", Toast.LENGTH_LONG).show();
            }
            else {
                Matrix matrix = new Matrix();
                ivImageProduct.setScaleType(ImageView.ScaleType.MATRIX);   //required
                matrix.postRotate(90,ivImageProduct.getDrawable().getBounds().width()/2,ivImageProduct.getDrawable().getBounds().height()/2);
                Bitmap bmp=Bitmap.createBitmap(bitmap, 0, 0,bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                bitmap.recycle();
                bitmap=bmp;
                ivImageProduct.setImageBitmap(bitmap);
            }
        }

Ответ 19

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

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);

Ответ 20

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

int i=0;

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

imageView.setRotation(i+90);
i=i+90;

Ответ 21

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

imgSplash.animate().rotationBy(360f).setDuration(3000).setInterpolator(new LinearInterpolator()).start();