web-dev-qa-db-fra.com

Android: faire pivoter l'image en image par 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);
143
rijinrv

Un autre moyen simple de faire pivoter un ImageView:
PDATE:
Importations requises:

import Android.graphics.Matrix;
import Android.widget.ImageView;

Code: (En supposant que imageView, angle, pivotX et pivotY soient 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 de créer un nouveau bitmap à chaque fois.

REMARQUE: Pour faire pivoter une ImageView sur ontouch à l'exécution, vous pouvez définir onTouchListener sur ImageView & faites-le pivoter en ajoutant les deux dernières lignes (c.-à-d. la matrice postRotate & réglez-le sur imageView ) dans la section de code ci-dessus de votre écouteur tactile ACTION_MOVE .

187
Aks

mImageView.setRotation(angle) avec API> = 11

166
Frolik

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 Android Studio xml, mais il fonctionne comme prévu.

61
Oleksiy

Il y a deux façons de le faire:

1 Utiliser 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 utilisez RotateAnimation sur le View que vous souhaitez faire pivoter et assurez-vous que l’animation est définie sur fillAfter=true, duration=0 et 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);
42
Rotemmiz

Je sais que c'est incroyablement tard, mais comme cela m'a été utile, cela pourrait aider les autres.

À partir de l'API 11, vous pouvez définir la rotation absolue d'un ImageView par programme à l'aide de la méthode imageView.setRotation(angleInDegrees);.

Par absolu, je veux dire que vous pouvez appeler cette fonction de manière répétée sans avoir à suivre la rotation en cours. Cela signifie que si je tourne en passant 15F à la méthode setRotation(), puis appelle à nouveau setRotation() avec 30F, la rotation de l'image est de 30 degrés et non de 45 degrés.

Remarque: Cela fonctionne en fait pour toute sous-classe de l'objet View, pas seulement ImageView.

8
thomaspsk

Ceci est mon implémentation de RotatableImageView . L'utilisation est très simple: il suffit de copier attrs.xml et RotatableImageView.Java dans votre projet et ajoutez RotatableImageView à votre mise en page. Définissez l'angle de rotation souhaité à l'aide du paramètre , exemple: angle .

<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 rencontrez des problèmes avec l'affichage des images, essayez de modifier le code dans la méthode RotatableImageView.onDraw () ou utilisez la méthode draw () à la place.

5
petrnohejl

De même, si vous souhaitez faire pivoter un ImageView de 180 degrés verticalement ou horizontalement, vous pouvez utiliser les propriétés scaleY ou scaleX et les définir sur -1f. Voici un exemple Kotlin:

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

La valeur 1f permet de ramener un ImageView à son état normal:

imageView.scaleY = 1f
imageView.scaleX = 1f
3
Yamashiro Rion

Je pense que la meilleure méthode :)

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

J'ai un solution à cela. En fait, il s’agit d’une solution à un problème survenant après la rotation (une image rectangulaire ne convient pas à ImagView), mais elle couvre également votre problème. Bien que cette solution propose une animation pour le meilleur ou pour le pire

    int h,w;
    Boolean safe=true;

Obtenir les paramètres de imageView n’est pas possible à l’initialisation de l’activité Pour ce faire, veuillez vous référer à ceci solutionOU régler le dimensions sur onClick d'un bouton comme celui-ci

    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 
       }

Et le code à exécuter lorsque nous voulons faire pivoter 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();
        }
    });

Cette solution est suffisante pour le problème ci-dessus. Bien que cela réduise l'imageView même si cela n'est pas nécessaire (lorsque la hauteur est inférieure à Largeur). Si cela vous dérange, vous pouvez ajouter un autre opérateur ternaire dans scaleX/scaleY.

2
Gaurav Chaudhari

Peut aussi être fait de cette façon: -

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

obtenu d'ici.

2
Debasish Ghosh

voici une solution intéressante pour mettre un dessinable tourné pour une 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;
}

usage:

Bitmap b=...
float angle=...
final Drawable rotatedDrawable = getRotateDrawable(b,angle);
root.setImageDrawable(rotatedDrawable);

une autre alternative:

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

de plus, si vous souhaitez faire pivoter le bitmap, mais que vous avez peur de MOO, vous pouvez utiliser une solution NDK que j'ai créée here =

1
android developer

Faire pivoter une image dans Android avec délai:

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

essayez ceci sur une vue personnalisée

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
jeet.chanchawat

Si vous souhaitez uniquement faire pivoter la vue visuellement, vous pouvez utiliser:

iv.setRotation(float)
1
mgm

Une autre solution possible consiste à créer votre propre vue Image personnalisée (par exemple, RotateableImageView extends ImageView) ... et à remplacer le onDraw () pour faire pivoter le canevas/bitmaps avant de le redérer sur le canevas. N'oubliez pas de restaurer le canevas. retour.

Mais si vous envisagez de ne faire pivoter qu'une seule instance d'image, votre solution devrait suffire.

0
Navin Ilavarasan

Essayez ce code à 100% de travail;

Cliquez sur le bouton de rotation pour écrire ce code:

        @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
Gaurav Sharma
Matrix matrix = new Matrix();
imageView.setScaleType(ImageView.ScaleType.MATRIX); //required
matrix.postRotate((float) 20, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
imageView.setImageMatrix(matrix);

comment utiliser?

public class MainActivity extends AppCompatActivity {
   int view = R.layout.activity_main;
   TextView textChanger;
   ImageView imageView;
   @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(view);
      textChanger = findViewById(R.id.textChanger);
      imageView=findViewById(R.id.imageView);
      textChanger.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            roateImage(imageView);
         }
      });
   }
   private void roateImage(ImageView imageView) {
      Matrix matrix = new Matrix();
      imageView.setScaleType(ImageView.ScaleType.MATRIX); //required
      matrix.postRotate((float) 20, imageView.getDrawable().getBounds().width()/2,    imageView.getDrawable().getBounds().height()/2);
      imageView.setImageMatrix(matrix);
   }
}
0
Amir Hosseinzadeh

écrivez simplement ceci dans votre résultat d'activité

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

Plutôt que de convertir une image en bitmap puis de la faire pivoter, essayez de faire pivoter la vue directe de l'image comme ci-dessous.

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

Suivez la réponse ci-dessous pour la rotation continue d'une image view.

int i=0;

Si le bouton de rotation est cliqué

imageView.setRotation(i+90);
i=i+90;
0
Harish Reddy

Malheureusement, je ne pense pas que ce soit le cas. La classe Matrix est responsable de toutes les manipulations d'image, qu'il s'agisse de rotation, de contraction/croissance, d'inclinaison, etc.

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

Mes excuses, mais je ne peux pas penser à une alternative. Peut-être que quelqu'un d'autre pourrait le faire, mais les fois où j'ai eu à manipuler une image, j'ai utilisé une matrice.

Bonne chance!

0
roboguy12

si vous voulez faire pivoter une image de 180 degrés, mettez ces deux valeurs dans la balise imageview: -

Android:scaleX="-1"
Android:scaleY="-1"

Explication: - scaleX = 1 et scaleY = 1 représentent son état normal, mais si nous mettons -1 dans la propriété scaleX/scaleY, il sera pivoté de 180 degrés

0
Prashant Kumar

sans matrice et animée:

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