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 ]

186 голосов
/ 11 апреля 2012

Еще один простой способ поворота 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 part.

163 голосов
/ 24 января 2013

mImageView.setRotation(angle) с API> = 11

60 голосов
/ 10 октября 2014

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

android:rotation="90"

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

42 голосов
/ 25 января 2012

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

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);
8 голосов
/ 25 октября 2016

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

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

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

Примечание: На самом деле это работает для любого подкласса объекта View , а не только для ImageView.

5 голосов
/ 27 августа 2012

Это моя реализация 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 ().

3 голосов
/ 20 декабря 2018

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

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

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

imageView.scaleY = 1f
imageView.scaleX = 1f
2 голосов
/ 29 августа 2018

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

int angle = 0;
imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            angle = angle + 90;
            imageView.setRotation(angle);
        }
    });
2 голосов
/ 27 октября 2018

Можно также сделать так: -

imageView.animate().rotation(180).start();

получено отсюда.

2 голосов
/ 25 декабря 2017

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

    int h,w;
    Boolean safe=true;

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

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

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

...