Android: Görüntüyü görüntüde bir açıyla döndürme


154

ImageView bir görüntüde bir açıyla döndürmek için aşağıdaki kodu kullanıyorum. Daha basit ve daha az karmaşık bir yöntem var mı?

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
2014 için PS, Android Studio'daki XML'de "döndürme" yi ayarlayabileceğiniz anlaşılıyor. ('Metin' düzenini kullanarak rahatsız
edemezseniz

cevabı burada bulabilirsiniz. stackoverflow.com/a/52983423/5872337
Geet Thakur

Yanıtlar:


194

Bir döndürmenin başka bir basit yolu ImageView:
GÜNCELLEME:
Gerekli içe aktarmalar:

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

Kod: (varsayarsak imageView, angle, pivotXve pivotYzaten tanımlanmıştır)

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

Bu yöntem her seferinde yeni bir bitmap oluşturmayı gerektirmez.

NOT: To bir döndürmek ImageViewüzerinde ontouch ayarlayabileceğiniz zamanında onTouchListener üzerinde ImageView& o (yani son iki satırı ekleyerek döndürmek postRotate matris & üzerinde ayarlayın imageview dokunmatik dinleyici olarak) Yukarıdaki kod bölümünde ACTION_MOVE parçası.


109
Bütünlük için burada ImageView'değerleri dayalı çizgi :matrix.postRotate( 180f, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
Stefan Hoth

2
her dokunma etkinliğinde görüntü görünümünü nasıl döndürürüm?
Saurabh

14
benim için, relativeLayout içinde döndürülürse, imageView artık düzene sığmayacak şekilde içerilen görüntünün boyutuna büyür. Bunu nasıl çözecek birisi var mı?
Makibo

7
Not: işe Bunun için, size belirlemek zorunda ImageViewbireyin srcniteliği. yerine ' özniteliğini getDrawable()ayarladığımı anlayana kadar benim için null döndürüyordu . facepalmImageViewbackgroundsrc
Gary S.

1
Görüntüyü yalnızca görüntü görünümünde döndürür. Görüntünün kendisini de döndürmek için ne yapmalıyım?
Ege

179

mImageView.setRotation(angle) API ile> = 11


3
ayrıca görünümün genişliğini ve yüksekliğini doğru boyuta değiştirir mi? ya da sadece görünüşünü değiştiriyor mu?
android geliştirici

5
Döndürürken "döndürme animasyonu" almanın bir yolu var mı?
Ivan Morgillo

13
De misin göz atabilirsiniz @IvanMorgillo ViewPropertyAnimatorgibi kullanıldığı,aView.animate().rotation(20).start()
jokester

5
@IvanMorgillo: Kullanın rotationBy(). Örneğin view.animate().rotationBy(180f).start(),. Ancak görünümün arka arkaya tıklanması sorunlu hale gelir.
Mangesh

Bir düğmeye bu kodu kullanıyorum. İlk tıklama tamam, ancak sonraki tıklamalar artık dönmüyor. Bunu düzeltmek için başka bir satır koymalı mıyım?
Eggakin Baconwalker

73

API 11 veya daha üstünü destekliyorsanız, aşağıdaki XML özelliğini kullanabilirsiniz:

android:rotation="90"

Android Studio xml önizlemesinde doğru görüntülenmeyebilir, ancak beklendiği gibi çalışır.


3
XML önizleme ile ilgili ipucu bana çok yardımcı oldu
ngu

Döndürme uygulandıktan sonra XML önizlemesi benim için düzgün görüntüleniyor.
Dick Lucas

Bu görüntüyü döndürür ancak görüntüyü döndürmez! Bu, görüntünün yanına boş alanlar ekler. backgroundEfekti görmek için sadece a ekleyin .
YBrush

43

Bunu yapmanın iki yolu vardır:

1 MatrixYeni bir bitmap oluşturmak için kullanma :

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 kullanımı RotateAnimationile ilgili Viewsize Döndür istiyorum ve emin Animasyon set yapmak için fillAfter=true, duration=0vefromDegrees=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"
/>

ve Animasyonu kodla şişirin:

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

danx .. Ama dinamik olarak Görünüm üzerinde RotateAnimation yapmak için dere .. D açısını dinamik olarak ayarlamak demek ..
rijinrv

döndürmeniz gereken görüntü bir ListView
içindeyse

9

Bunun delice geç olduğunu biliyorum, ama benim için yararlı oldu, bu yüzden başkalarına yardımcı olabilir.

API 11'den itibaren, imageView.setRotation(angleInDegrees);yöntemi kullanarak ImageView programının mutlak dönüşünü programlı olarak ayarlayabilirsiniz .

Mutlak olarak, şu anki dönüşü takip etmek zorunda kalmadan bu işlevi tekrar tekrar çağırabileceğiniz anlamına gelir. Ben geçirerek döndürmek eğer, Anlam 15Fiçin setRotation()yönteme ve sonra çağrı setRotation()ile tekrar 30F30 derece değil, 45 derece be ile resmin dönme.

Not: Bu aslında yalnızca ImageView için değil View nesnesinin herhangi bir alt sınıfı için çalışır .


Döndürme konusundaki imajım, sayfada doğal olarak biraz daha yüksek oluyor. Nasıl ayarlayabilirim?
Bilmek İstiyorum

Resminiz düzgün bir şekilde ortalanmış mı? Resminizde düzensiz bir saydamlık varsa, döndürme döndürülürken konumunun değişmesine neden olabilir
thomaspsk

Hiç kimse, görüntü döndüğünde ekseni kullanır. Cep telefonunuzu elinizde dikey konumda hayal edin, şimdi yatay konuma döndürün. Artık elinize dokunmuyor. Yani bir boşluk var ... ama setPivotX () kullanarak çözdüm
bilmek istiyorum

5

Bu benim RotatableImageView uygulamam . Kullanımı çok kolaydır: sadece kopyalayıp attrs.xml ve RotatableImageView.java projenize ve düzeninize RotatableImageView ekleyin. Örnek: angle parametresini kullanarak istenen dönüş açısını ayarlayın .

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

Görüntü görüntüleme ile ilgili bazı sorunlarınız varsa, RotatableImageView.onDraw () yönteminde kodu değiştirmeyi deneyin veya bunun yerine draw () yöntemini kullanın.


1
Çok yararlı. Paylaşım için teşekkürler!
Stefan Hoth

RotatableImageView kullanırken bir NullPointerException aldım. korumalı void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {int w = getDrawable (). getIntrinsicWidth (); ...} BTW, kodda kullanıyordum (ve varsayılan bir görüntüye sahibim), xml'de değil.
RRTW

bu imageView bir gridView içinde kullanıldığında garip sorunlar yaşıyor. siz kaydırıncaya kadar görünmez olmaya devam eder.
android geliştirici


3

Ayrıca, bir ImageView'ı dikey veya yatay olarak 180 derece döndürmek istiyorsanız, scaleYveya scaleXözelliklerini kullanabilir ve olarak ayarlayabilirsiniz -1f. İşte bir Kotlin örneği:

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

1f değeri bir ImageView öğesini normal durumuna döndürmek için kullanılır:

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

2

Buna bir çözüm buldum . Aslında, dönüşten sonra ortaya çıkan bir soruna bir çözümdür (Dikdörtgen görüntü ImagView'e uymuyor), ancak sorununuzu da kapsıyor.

    int h,w;
    Boolean safe=true;

Aktivitenin başlatılmasında imageView parametrelerini almak mümkün değildir Bunu yapmak için lütfen bu çözüme bakın VEYA boyutları onClick of a Button olarak ayarlayın

    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'ı döndürmek istediğimizde çalıştırılacak kod

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

Bu çözüm, yukarıdaki Sorun için yeterlidir.GörüntüView gerekli olmasa bile (yükseklik Genişlikten küçük olduğunda) küçülse de, sizi rahatsız ediyorsa, scaleX / scaleY içine başka bir üçlü operatör ekleyebilirsiniz.


2

Bence en iyi yöntem :)

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

2

Android'de görüntüyü gecikmeyle döndürün:

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

1

bunu özel bir görünümde deneyin

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

bir image için döndürülebilir bir çekilebilir koymak için güzel bir çözüm

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

kullanımı:

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

başka bir alternatif:

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

Ayrıca, bitmap'i döndürmek, ancak OOM'dan korkmak istiyorsanız, burada yaptığım bir NDK çözümünü kullanabilirsiniz


1

Görünümü yalnızca görsel olarak döndürmek istiyorsanız şunları kullanabilirsiniz:

iv.setRotation(float)

1

Kotlin için,

mImageView.rotation = 90f //angle in float

Bu, görüntüyü döndürmek yerine imageView öğesini döndürür

Ayrıca, Viewsınıfta bir yöntem olsa . Böylece, herhangi bir görünümü kullanarak hemen döndürebilirsiniz.



0

Başka bir olası çözüm, kendi özel Görüntü görünümünüzü (say RotateableImageView extends ImageView) ... oluşturmak ve tuvale dönmeden önce tuval / bitmap'leri döndürmek için onDraw () 'ı geçersiz kılmaktır.

Ancak yalnızca tek bir görüntü görünümü örneğini döndürecekseniz, çözümünüz yeterince iyi olmalıdır.


0

matrissiz ve hareketli:

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

0

bunu etkin olmadığınızda yazmanız yeterlidir

            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

Bu kodu% 100 çalışmayı deneyin;

Döndür düğmesinde şu kodu yazın:

        @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

Görüntüyü bitmap'e dönüştürmek ve sonra döndürmek yerine, doğrudan görüntü görünümünü aşağıdaki kod gibi döndürmeyi deneyin.

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

Bir görüntülemenin sürekli döndürülmesi için aşağıdaki yanıtı izleyin

int i=0;

Döndür düğmesi tıklanırsa

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

0

Bir görüntüyü 180 derece döndürmek istiyorsanız, bu iki değeri imageview etiketine yerleştirin: -

android:scaleX="-1"
android:scaleY="-1"

Açıklama: - scaleX = 1 ve scaleY = 1 repesent normal durumdur, ancak scaleX / scaleY özelliğine -1 koyarsak 180 derece döndürülür


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

nasıl kullanılır?

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

ImageView'in döndürme özniteliğini kullanabilirsiniz

Aşağıda, Android kaynağından ayrıntılarla ImageView özniteliği verilmiştir

<!-- rotation of the view, in degrees. -->
<attr name="rotation" format="float" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.