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);
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 surImageView
& 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 .
mImageView.setRotation(angle)
avec API> = 11
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.
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);
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.
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.
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
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);
}
});
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.
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 =
Faire pivoter une image dans Android avec délai:
imgSplash.animate().rotationBy(360f).setDuration(3000).setInterpolator(new LinearInterpolator()).start();
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);
}
}
Si vous souhaitez uniquement faire pivoter la vue visuellement, vous pouvez utiliser:
iv.setRotation(float)
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.
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);
}
}
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);
}
}
é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);
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);
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;
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!
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
sans matrice et animée:
{
img_view = (ImageView) findViewById(R.id.imageView);
rotate = new RotateAnimation(0 ,300);
rotate.setDuration(500);
img_view.startAnimation(rotate);
}