171 votes

Android : Faire pivoter l'image dans imageview d'un angle

J'utilise le code suivant pour faire pivoter une image dans ImageView d'un angle. Existe-t-il une méthode plus simple et moins complexe ?

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 votes

PS pour 2014, il semble que vous pouvez simplement définir la "rotation" dans le XML dans Android Studio. (Vous pouvez même simplement cliquer sur le bouton "propriétés de l'expert" à droite, si vous ne pouvez pas vous embêter à utiliser la mise en page "Texte").

0 votes

Trouver la réponse ici. stackoverflow.com/a/52983423/5872337

204voto

Aks Points 1255

Une autre façon simple de faire pivoter un ImageView :
UPDATE :
Importations requises :

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

Code : (Supposition imageView , angle , pivotX & pivotY sont déjà définis)

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

Cette méthode ne nécessite pas la création d'un nouveau bitmap à chaque fois.

REMARQUE : Pour faire pivoter un ImageView sur ontouch au moment de l'exécution, vous pouvez définir onTouchListener sur ImageView & le faire pivoter en ajoutant les deux derniers lignes (c'est-à-dire postRotate matrice et le mettre sur imageView ) dans le code ci-dessus dans votre écouteur tactile ACTION_MOVE partie.

112 votes

Par souci d'exhaustivité, voici la ligne basée sur la ImageView Les valeurs de l'UE : matrix.postRotate( 180f, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);

2 votes

Comment faire pivoter une image à chaque événement tactile ?

14 votes

Pour moi, si on fait une rotation dans un relativeLayout, l'imageView grandit à la taille de l'image contenue, ne s'adaptant plus à la disposition. Quelqu'un sait-il comment résoudre ce problème ?

195voto

Frolik Points 423

mImageView.setRotation(angle) avec API>=11

3 votes

Cela modifierait-il également la largeur et la hauteur de la vue à la taille correcte ? ou cela ne change-t-il que l'apparence ?

5 votes

Existe-t-il un moyen d'avoir une "animation de rotation" pendant la rotation ?

13 votes

@IvanMorgillo Vous pouvez jeter un coup d'oeil à ViewPropertyAnimator qui est utilisé comme aView.animate().rotation(20).start()

85voto

Oleksiy Points 3145

Si vous prenez en charge l'API 11 ou une version ultérieure, vous pouvez simplement utiliser l'attribut XML suivant :

android:rotation="90"

Il se peut qu'il ne s'affiche pas correctement dans l'aperçu xml d'Android Studio, mais il fonctionne comme prévu.

3 votes

L'astuce concernant l'aperçu xml m'a beaucoup aidé.

0 votes

L'aperçu XML s'affiche correctement pour moi après l'application de la rotation.

0 votes

Cela fera tourner la vue mais pas l'image ! Ceci ajoutera des zones vides à côté de l'image. Il suffit d'ajouter un background pour voir l'effet.

44voto

Rotemmiz Points 4152

Il y a deux façons de le faire :

1 Utilisation Matrix pour créer un nouveau bitmap :

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 utilisation RotateAnimation sur le View que vous voulez faire pivoter, et assurez-vous que l'Animation est réglée sur fillAfter=true , duration=0 y 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"
/>

et gonfler l'animation dans le code :

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

0 votes

Danx Mais y a-t-il un moyen de faire une RotateAnimation sur la vue de façon dynamique, c'est-à-dire de définir l'angle de façon dynamique ?

0 votes

Cette solution est plus efficace que la réponse acceptée si l'image que vous devez faire pivoter se trouve dans une ListView.

5voto

petrnohejl Points 2483

C'est mon implémentation de RotatableImageView . L'utilisation est très simple : il suffit de copier attrs.xml y RotatableImageView.java dans votre projet et ajoutez RotatableImageView à votre layout. Définissez l'angle de rotation souhaité en utilisant exemple:angle paramètre.

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

Si vous avez des problèmes avec l'affichage de l'image, essayez de changer le code dans RotatableImageView.onDraw() ou utilisez la méthode draw() à la place.

1 votes

Très utile. Merci pour le partage !

0 votes

J'ai obtenu une NullPointerException en utilisant RotatableImageView. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int w=getDrawable().getIntrinsicWidth() ; ... } BTW, je l'ai utilisé dans le code (et avoir une image par défaut donnée), pas dans le xml.

0 votes

Cette imageView a des problèmes bizarres lorsqu'elle est utilisée dans un gridView. elle devient invisible jusqu'à ce que vous la fassiez défiler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X