2012-01-24 5 views
112

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

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

PS для 2014 года, похоже, вы можете просто установить «вращение» в XML в Android Studio. (Вы можете просто щелкнуть по кнопке «экспертные свойства» справа, если вас не беспокоит использование макета «Текст»!) ​​ – Fattie

ответ

171

Другой простой способ повернуть 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 часть.

+96

Для полноты здесь приведена строка, основанная на значениях 'ImageView':' matrix.postRotate (180f, imageView.getDrawable(). GetBounds(). Width()/2, imageView.getDrawable(). GetBounds(). Height()/2); ' –

+2

как поворачивать изображение в каждом событии касания? – Saurabh

+11

для меня, если он повернут в relativeLayout, изображение увеличится до размера содержащегося изображения, а не встраивается в макет. У кого-нибудь есть опыт, как это решить? – Makibo

0

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

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

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

Удачи!

0

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

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

39

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

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

danx .. Но это отличный способ для RotateAnimation на представлении динамически .. Я хочу установить d угол динамически .. – rijinrv

+0

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

5

Это мой номер implementation of 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() метод или использовать метод рисования() вместо этого.

+1

Очень полезно. Спасибо, что поделился! –

+0

У меня возникло исключение NullPointerException при использовании RotatableImageView. protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { int w = getDrawable(). GetIntrinsicWidth(); ... } BTW, я использовал его в коде (и имел заданное изображение по умолчанию), а не в xml. – RRTW

+0

это изображениеView имеет странные проблемы при использовании в gridView. он продолжает становиться невидимым, пока вы не прокрутите. –

1

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

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

Спасибо, что это работает для меня ... – shripal

136

mImageView.setRotation(angle) с API> = 11

+3

также изменит ли ширина и высоту вид на правильный размер? или он меняет только то, как он выглядит? –

+5

Есть ли способ иметь «анимацию вращения» при вращении? –

+10

@ IvanMorgillo Вы можете посмотреть 'ViewPropertyAnimator', который используется как' aView.animate(). Rotation (20) .start() ' – Jokester

1

вот хорошее решение для размещения повернутой вытяжки для 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(); 
     } 
    }; 
} 

также, если вы хотите, чтобы повернуть растровое изображение, но боится ООМ, вы можете использовать решение NDK я сделал here

48

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

android:rotation="90" 

он не может неправильно отображаться в Android Studio XML просмотра, но он работает как ехр ected.

+2

Подсказка относительно предварительного просмотра xml мне очень помогла – ngu

0

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

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

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

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

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

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

+0

Мое изображение при вращении становится естественно немного выше на странице. Как я могу установить его? –

+0

Правильно ли ваше изображение? Если у вас есть неравномерность прозрачности изображения, поворот может привести к тому, что он будет меняться при повороте. – thomaspsk

+0

Ни один человек, когда изображение вращается, оно использует ось. Представьте свой мобильный телефон в вертикальном положении на руке, теперь поверните его в горизонтальное положение. Он больше не трогает вашу руку. Итак, есть пространство ... Но я решил это, используя setPivotX() –

0

просто написать это в 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

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

int h,w; 
    Boolean safe=true; 

Получение параметры ImageView не представляется возможным при инициализации деятельности для этого, пожалуйста, обратитесь к этому solution ИЛИ установленных размеров в 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(); 
     } 
    }); 

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

0

Попробуйте этот код 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); 
      } 
     } 
0

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

iv.setRotation(float) 
Смежные вопросы