Android: Rotiți imaginea în imageview cu un unghi (Programare, Android, Bitmap, Rotație, Imageview)

rijinrv a intrebat.

Folosesc următorul cod pentru a roti o imagine în ImageView cu un unghi. Există vreo metodă mai simplă și mai puțin complexă disponibilă.

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

Comentarii

  • PS pentru 2014, se pare că puteți seta pur și simplu „rotation” în XML în Android Studio. (Puteți chiar să faceți clic pe butonul „proprietăți expert” din dreapta, dacă nu vă deranjează să folosiți aspectul „Text”)! –  > Por Fattie.
  • găsiți răspunsul chiar aici. stackoverflow.com/a/52983423/5872337 –  > Por Geet Thakur.
25 răspunsuri
Aks

O altă modalitate simplă de a roti un ImageView:
UPDATE:
Importuri necesare:

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

Cod: (Presupunând că imageView, , angle, , pivotX & pivotY sunt deja definite)

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

Această metodă nu necesită crearea unei noi hărți de biți de fiecare dată.

NOTĂ: Pentru a roti un ImageView pe ontouch în timpul execuției, puteți seta onTouchListener pe ImageView & rotiți-l prin adăugarea ultimelor două linii (adică. postRotate & setați-l pe imageView) în secțiunea de cod de mai sus în secțiunea de ascultare tactilă. ACTION_MOVE parte.

Comentarii

    111

  • Pentru a fi completă, aici este linia bazată pe ImageView‘s values: matrix.postRotate( 180f, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2); –  > Por Stefan Hoth.
  • cum să rotiți imageview la fiecare eveniment de atingere? –  > Por Saurabh.
  • pentru mine, dacă se rotește într-un relativeLayout, imageView crește la dimensiunea imaginii conținute, nu se mai potrivește în layout. Are cineva experiență cum să rezolve acest lucru? –  > Por Makibo.
  • Notă: pentru ca acest lucru să funcționeze, trebuie să setați ImageView‘s src atribut. getDrawable() mi-a returnat null până când mi-am dat seama că am setat atributul ImageView‘s background în loc de src. facepalm –  > Por Gary Sheppard.
  • Se rotește imaginea doar în imageview. Ce ar trebui să fac pentru a roti și imaginea în sine? –  > Por Ege.
Frolik

mImageView.setRotation(angle) cu API>=11

Comentarii

  • ar schimba și lățimea și înălțimea vizualizării la dimensiunea corectă ? sau se schimbă doar modul în care arată ? –  > Por dezvoltator android.
  • Există o modalitate de a avea o „animație de rotație” în timpul rotirii? –  > Por Ivan Morgillo.
  • @IvanMorgillo Puteți arunca o privire la ViewPropertyAnimator, , care este folosit ca aView.animate().rotation(20).start() –  > Por Jokester.
  • @IvanMorgillo: Folosiți rotationBy(). De exemplu: , view.animate().rotationBy(180f).start(). Dar devine problematic dacă vizualizarea este accesată succesiv. –  > Por Mangesh.
  • Folosesc acest cod într-un buton. Primul clic este ok, dar la următoarele clicuri nu se mai rotește. Ar trebui să pun o altă linie pentru a rezolva acest lucru? –  > Por Eggakin Baconwalker.
Oleksiy

Dacă suportați API 11 sau mai mare, puteți folosi doar următorul atribut XML:

android:rotation="90"

Este posibil să nu se afișeze corect în previzualizarea Android Studio xml, dar funcționează așa cum era de așteptat.

Comentarii

  • Indiciul privind previzualizarea xml m-a ajutat foarte mult –  > Por ngu.
  • Previzualizarea XML se afișează pentru mine în mod corespunzător după ce se aplică rotația. –  > Por Dick Lucas.
  • Acest lucru va roti vizualizarea, dar nu și imaginea! Acest lucru va adăuga zone goale lângă imagine. Adăugați doar un background pentru a vedea efectul. –  > Por YBrush.
Rotemmiz

Există două moduri de a face acest lucru:

1 Folosind Matrix pentru a crea un nou 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 utilizați RotateAnimation pe View pe care doriți să o rotiți, și asigurați-vă că Animația este setată pe fillAfter=true, , duration=0, , și 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"
/>

și umflați Animația în cod:

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

Comentarii

  • danx… Dar există vreo modalitate de a face RotateAnimation pe vizualizare în mod dinamic, adică de a seta dinamic unghiul… –  > Por rijinrv.
  • acest lucru funcționează mai bine decât răspunsul acceptat dacă imaginea pe care trebuie să o rotiți se află într-un ListView –  > Por Daren.
thomaspsk

Știu că acest lucru este nebunește de târziu, dar a fost util pentru mine, așa că ar putea ajuta pe alții.

Începând cu API 11, puteți seta rotația absolută a unui ImageView în mod programatic, utilizând opțiunea imageView.setRotation(angleInDegrees); metoda.

Prin absolut, vreau să spun că puteți apela în mod repetat această funcție fără a fi nevoie să țineți evidența rotației curente. Adică, dacă mă rotesc trecând 15F la metoda setRotation() și apoi apelez la metoda setRotation() din nou cu 30F, , rotația imaginii va fi de 30 de grade, nu de 45 de grade.

Notă: Acest lucru funcționează de fapt pentru orice subclasă a clasei View nu doar ImageView.

Comentarii

  • Imaginea mea la rotire ajunge în mod natural puțin mai sus pe pagină. Cum pot să o cobor? –  > Por Vreau să știu.
  • Imaginea dvs. este centrată corect? Dacă aveți o cantitate neuniformă de transparență în imagine, rotația poate face ca aceasta să pară că își schimbă poziția la rotire –  > Por thomaspsk.
  • Nu omule, când imaginea se rotește folosește axa. Imaginează-ți telefonul mobil în poziție verticală pe mâna ta, acum rotește-l pe orizontală. Nu-ți mai atinge mâna. Deci există un spațiu… Dar am rezolvat-o folosind setPivotX() –  > Por Vreau să știu.
petrnohejl

Acesta este implementare a RotatableImageView. Utilizarea este foarte ușoară: trebuie doar să copiați attrs.xml și RotatableImageView.java în proiectul dvs. și adăugați RotatableImageView la aspectul dvs. Setați unghiul de rotație dorit folosind example:angle parametrul

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

Dacă aveți probleme cu afișarea imaginii, încercați să modificați codul din RotatableImageView.onDraw() sau utilizați în schimb metoda draw().

Comentarii

  • Foarte util. Vă mulțumim pentru partajare! –  > Por Stefan Hoth.
  • Am primit o excepție NullPointerException în timp ce foloseam RotatableImageView. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int w=getDrawable().getIntrinsicWidth(); … } BTW, am folosit-o în cod (și am o imagine implicită dată), nu în xml. –  > Por RRTW.
  • acest imageView are probleme ciudate atunci când este folosit într-un gridView. continuă să devină invizibil până când faci scroll. –  > Por dezvoltator android.
Aziz

Pentru Kotlin,

mImageView.rotation = 90f //angle in float

Acest lucru va roti imageView în loc să rotească imaginea

De asemenea, deși este o metodă în View clasă. Deci, puteți roti cam orice vizualizare folosind-o.

Debasish Ghosh

Se poate face și în acest fel:-

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

luat de aici.

Comentarii

  • Mulțumesc! Este foarte ușor și rapid –  > Por zinonX.
Gaurav Chaudhari

Am o soluție la acest lucru. de fapt, este o soluție la o problemă care apare după rotație (imaginea dreptunghiulară nu se potrivește ImagView), dar acoperă și problema ta..Deși această soluție are animație la bine și la rău

    int h,w;
    Boolean safe=true;

Obținerea parametrilor imageView nu este posibilă la inițializarea activitățiiPentru a face acest lucru, vă rugăm să consultați această soluțieSAU setați dimensiunile la onClick al unui buton, astfel

    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 
       }

Și codul care trebuie executat atunci când dorim să rotim 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();
        }
    });

Această soluție este suficientă pentru problema de mai sus.Deși va micșora imageView chiar dacă nu este necesar (atunci când înălțimea este mai mică decât lățimea).Dacă vă deranjează, puteți adăuga un alt operator ternar în interiorul scaleX/scaleY.

Yamashiro Rion

De asemenea, dacă doriți să rotiți un ImageView cu 180 de grade pe verticală sau pe orizontală, puteți utiliza scaleY sau scaleX și să le setați la -1f. Iată un exemplu Kotlin:

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

1f Valoarea este utilizată pentru a readuce un ImageView la starea sa normală:

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

Aftab Alam

Rotiți o imagine în android cu întârziere:

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

Trk

Cred că este cea mai bună metodă 🙂

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

jeet.chanchawat

încercați acest lucru pe o vizualizare personalizată

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

android developer

aici este o soluție frumoasă pentru a pune un drawable rotit pentru un 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;
}

utilizare:

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

o altă alternativă:

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 asemenea, dacă doriți să rotiți bitmap-ul, dar vă temeți de OOM, puteți utiliza o soluție NDK pe care am făcut-o aici

mgm

Dacă doriți doar să rotiți vizualizarea vizuală, puteți utiliza:

iv.setRotation(float)

i.am.jabi

Puteți utiliza pur și simplu rotation atribut al ImageView

Mai jos este atributul din ImageView cu detalii din sursa Android

<!-- rotation of the view, in degrees. -->
<attr name="rotation" format="float" />

user766650

Din păcate, nu cred că există. Matrix class este responsabilă pentru toate manipulările imaginii, fie că este vorba de rotire, micșorare/creștere, înclinare, etc.

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

Îmi cer scuze, dar nu mă pot gândi la o alternativă. Poate că altcineva ar putea să o facă, dar de câte ori am fost nevoit să manipulez o imagine am folosit un Matrix.

Mult succes!

Navin Ilavarasan

O altă soluție posibilă este să creați propria vizualizare personalizată a imaginii(să zicem RotateableImageView extends ImageView )…și să suprascrieți onDraw() pentru a roti fie pânza/bitmaps înainte de a reda pe pânza. nu uitați să restaurați înapoi pânza.

Dar dacă aveți de gând să rotiți doar o singură instanță de vizualizare a imaginii, soluția dvs. ar trebui să fie suficient de bună.

utilizator4747884

fără matrice și animat:

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

Lumea divertismentului

Scrieți doar acest lucru în 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); 

Gaurav Sharma

Încercați acest cod 100% de lucru;

La clic pe butonul de rotire, scrieți acest cod:

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

SWAPDROiD

Mai degrabă decât să convertiți imaginea în bitmap și apoi să o rotiți, încercați să rotiți vizualizarea directă a imaginii ca în codul de mai jos.

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

Harish Reddy

Urmați răspunsul de mai jos pentru rotirea continuă a unei imagini de vizualizare

int i=0;

Dacă se face clic pe butonul de rotire

imageView.setRotation(i+90);
i=i+90;

Prashant Kumar

dacă doriți să rotiți o imagine cu 180 de grade, atunci puneți aceste două valori în tag-ul imageview: –

android:scaleX="-1"
android_scaleY="-1"

Explicație: – scaleX = 1 și scaleY = 1 reprezintă starea normală a imaginii, dar dacă punem -1 la proprietățile scaleX/scaleY, atunci imaginea va fi rotită cu 180 de grade.

Amir Hosseinzadeh
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);

Cum se utilizează?

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