Android: Putar gambar dalam tampilan gambar dengan sudut

154

Saya menggunakan kode berikut untuk memutar gambar di ImageView dengan sudut. Apakah ada metode yang lebih sederhana dan lebih kompleks yang tersedia.

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);
rijinrv
sumber
6
PS untuk 2014, sepertinya Anda cukup mengatur "rotasi" di XML di Android Studio. (Anda bahkan dapat mengklik tombol "properti ahli" di sebelah kanan, jika Anda tidak dapat diganggu menggunakan tata letak 'Teks'!)
Fattie
temukan jawabannya di sini. stackoverflow.com/a/52983423/5872337
Geet Thakur

Jawaban:

194

Cara sederhana lain untuk merotasi ImageView:
PEMBARUAN:
Diperlukan impor:

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

Kode: (Dengan asumsi imageView, angle, pivotX& pivotYsudah ditentukan)

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

Metode ini tidak perlu membuat bitmap baru setiap kali.

CATATAN: Untuk memutar ImageViewdi ontouch saat runtime Anda dapat mengatur onTouchListener pada ImageView& putar dengan menambahkan dua baris terakhir (yaitu postRotate matriks & meletakkannya di imageView ) di bagian kode di atas berhubungan pendengar Anda ACTION_MOVE bagian.

Aks
sumber
109
Untuk kelengkapan di sini adalah garis berdasarkan nilai ImageView-nilai:matrix.postRotate( 180f, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
Stefan Hoth
2
bagaimana cara memutar tampilan gambar pada setiap acara sentuh?
Saurabh
14
bagi saya, jika diputar secara relatifLayout the imageView tumbuh ke ukuran gambar yang terkandung, tidak pas ke tata letak lagi. Adakah yang punya pengalaman bagaimana mengatasi ini?
Makibo
7
Catatan: untuk ini untuk bekerja, Anda harus mengatur Anda ImageView's srcatribut. getDrawable()itu kembali nol bagi saya sampai saya menyadari bahwa saya telah menetapkan ImageView's backgroundatribut bukan src. facepalm
Gary S.
1
Ini memutar gambar dalam imageview saja. Apa yang harus saya lakukan untuk memutar gambar itu sendiri?
Ege
178

mImageView.setRotation(angle) dengan API> = 11

Frolik
sumber
3
apakah itu juga akan mengubah lebar dan tinggi tampilan ke ukuran yang benar? atau apakah itu hanya mengubah tampilannya?
pengembang android
5
Apakah ada cara untuk memiliki "animasi rotasi" saat memutar?
Ivan Morgillo
13
@IvanMorgillo Anda dapat melihat ViewPropertyAnimator, yang digunakan sepertiaView.animate().rotation(20).start()
Jokester
5
@IvanMorgillo: Gunakan rotationBy(). Sebagai contoh view.animate().rotationBy(180f).start(),. Tetapi menjadi bermasalah jika tampilan diklik berturut-turut.
Mangesh
Saya menggunakan kode ini dalam sebuah tombol. Klik pertama ok, tapi klik berikutnya tidak berputar lagi. Haruskah saya menaruh beberapa jalur lain untuk memperbaikinya?
Eggakin Baconwalker
73

Jika Anda mendukung API 11 atau lebih tinggi, Anda bisa menggunakan atribut XML berikut:

android:rotation="90"

Mungkin tidak ditampilkan dengan benar di pratinjau Android Studio xml, tetapi berfungsi seperti yang diharapkan.

Oleksiy
sumber
3
Petunjuk tentang pratinjau xml banyak membantu saya
ngu
Pratinjau XML ditampilkan untuk saya dengan benar setelah rotasi diterapkan.
Dick Lucas
Ini akan memutar tampilan tetapi bukan gambar! Ini akan menambahkan area kosong di sebelah gambar. Cukup tambahkan backgrounduntuk melihat efeknya.
YBrush
43

Ada dua cara untuk melakukan itu:

1 Menggunakan Matrixuntuk membuat bitmap baru:

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 digunakan RotateAnimationpada ViewAnda ingin Putar, dan pastikan Animasi set untuk fillAfter=true, duration=0, danfromDegrees=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"
/>

dan Mengembang Animasi dalam kode:

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
myView.startAnimation(rotation);
Rotemmiz
sumber
danx .. Tapi apakah ini cara untuk melakukan RotateAnimation on the View secara dinamis..saya ingin mengatur sudut d secara dinamis ..
rijinrv
ini bekerja lebih baik daripada jawaban yang diterima jika gambar yang Anda perlu putar ada di ListView
Daren
9

Saya tahu ini sangat terlambat, tetapi itu membantu saya sehingga dapat membantu orang lain.

Pada API 11, Anda dapat mengatur rotasi absolut ImageView secara terprogram dengan menggunakan imageView.setRotation(angleInDegrees);metode ini.

Secara absolut, maksud saya Anda dapat berulang kali memanggil fungsi ini tanpa harus melacak rotasi saat ini. Artinya, jika saya memutar dengan melewati 15Fke setRotation()metode, dan kemudian memanggil setRotation()lagi dengan 30F, rotasi gambar dengan be 30 derajat, tidak 45 derajat.

Catatan: Ini benar-benar berfungsi untuk subclass apa pun dari objek View , bukan hanya ImageView.

thomaspsk
sumber
Gambar saya di rotating secara alami sedikit lebih tinggi pada halaman. Bagaimana saya bisa meletakkannya?
I Wanna Know
Apakah gambar Anda terpusat dengan benar? Jika Anda memiliki jumlah transparansi yang tidak merata dalam gambar Anda, rotasi dapat menyebabkannya tampak berubah posisi saat berputar
thomaspsk
Tidak ada laki-laki, ketika gambar diputar menggunakan poros. Bayangkan ponsel Anda dalam posisi vertikal di tangan Anda, sekarang putar ke horisontal. Itu tidak menyentuh tanganmu lagi. Jadi ada ruang ... Tapi saya menyelesaikannya dengan menggunakan setPivotX ()
I Wanna Know
5

Ini adalah implementasi saya dari RotatableImageView . Penggunaan sangat mudah: hanya menyalin attrs.xml dan RotatableImageView.java ke dalam proyek Anda dan menambahkan RotatableImageView untuk tata letak Anda. Tetapkan sudut rotasi yang diinginkan menggunakan contoh: parameter sudut .

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

Jika Anda memiliki beberapa masalah dengan tampilan gambar, coba ubah kode dalam metode RotatableImageView.onDraw () atau gunakan metode draw ().

petrnohejl
sumber
1
Sangat membantu. Terima kasih telah berbagi!
Stefan Hoth
Saya mendapat NullPointerException saat menggunakan RotatableImageView. void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {int w = getDrawable (). getIntrinsicWidth (); ...} BTW, saya menggunakannya dalam kode (dan telah memberikan gambar default), bukan dalam xml.
RRTW
imageView ini memiliki masalah aneh ketika digunakan di gridView. itu terus menjadi tidak terlihat sampai Anda gulir.
pengembang android
5

Dapat juga dilakukan dengan cara ini: -

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

dapatkan dari sini.

Debasish Ghosh
sumber
Terima kasih! Ini sangat mudah dan cepat
zinonX
3

Juga, jika Anda ingin memutar ImageView sebesar 180 derajat secara vertikal atau horizontal, Anda dapat menggunakan scaleYatau scaleXproperti dan mengaturnya -1f. Ini adalah contoh Kotlin:

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

1f nilai digunakan untuk mengembalikan ImageView ke keadaan normal:

imageView.scaleY = 1f
imageView.scaleX = 1f
Yamashiro Rion
sumber
2

Saya punya solusi untuk ini. Sebenarnya ini adalah solusi untuk masalah yang muncul setelah rotasi (Gambar persegi panjang tidak sesuai dengan ImagView) tetapi juga mencakup masalah Anda .. Meskipun Solusi ini memiliki Animasi yang lebih baik atau lebih buruk

    int h,w;
    Boolean safe=true;

Mendapatkan parameter dari imageView tidak dimungkinkan pada inisialisasi aktivitas Untuk melakukannya, silakan merujuk ke solusi ini ATAU atur dimensi di onKlik Tombol Seperti ini

    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 
       }

Dan kode yang akan dijalankan ketika kita ingin memutar 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();
        }
    });

Solusi ini cukup untuk Masalah di atas. Meskipun itu akan mengecilkan imageView bahkan jika itu tidak perlu (ketika tinggi lebih kecil dari Lebar). Jika itu mengganggu Anda, Anda dapat menambahkan operator ternary lain di dalam scaleX / scaleY.

Gaurav Chaudhari
sumber
2

Saya pikir metode terbaik :)

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

Putar gambar di Android dengan penundaan:

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

coba ini pada tampilan kustom

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

jeet.chanchawat
sumber
1

inilah solusi yang bagus untuk meletakkan gambar yang dapat diputar untuk 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;
}

pemakaian:

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

alternatif lain:

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

juga, jika Anda ingin memutar bitmap, tetapi takut OOM, Anda dapat menggunakan solusi NDK yang saya buat di sini

pengembang android
sumber
1

Jika Anda hanya ingin memutar tampilan secara visual, Anda dapat menggunakan:

iv.setRotation(float)
mgm
sumber
1

Untuk Kotlin,

mImageView.rotation = 90f //angle in float

Ini akan memutar imageView daripada memutar gambar

Juga, meskipun metode di Viewkelas. Jadi Anda dapat memutar tampilan apa pun dengan cukup banyak.

Aziz
sumber
0

Sayangnya, saya pikir tidak ada. The Matrixkelas bertanggung jawab untuk semua manipulasi gambar, apakah itu berputar, menyusut / tumbuh, miring, dll

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

Saya minta maaf, tetapi saya tidak bisa memikirkan alternatif. Mungkin orang lain mungkin bisa, tetapi saat saya harus memanipulasi gambar saya menggunakan Matrix.

Semoga berhasil!

roboguy12
sumber
0

Solusi lain yang mungkin adalah membuat tampilan Gambar kustom Anda sendiri (katakanlah RotateableImageView extends ImageView) ... dan menimpa onDraw () untuk memutar kanvas / bitmap sebelum kembali ke kanvas. Jangan lupa untuk mengembalikan kanvas kembali.

Tetapi jika Anda hanya akan memutar satu contoh tampilan gambar, solusi Anda harus cukup baik.

Navin Ilavarasan
sumber
0

tanpa matriks dan animasi:

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

cukup tulis ini di hasil onactivity Anda

            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); 
Dunia hiburan
sumber
0

Coba kode ini 100% berfungsi;

Pada tombol putar klik tulis kode ini:

        @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);
            }
        }
Gaurav Sharma
sumber
0

Alih-alih mengonversi gambar ke bitmap lalu memutarnya, cobalah memutar tampilan gambar langsung seperti kode di bawah ini.

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

Ikuti jawaban di bawah ini untuk rotasi tampilan gambar yang berkelanjutan

int i=0;

Jika tombol rotate diklik

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

jika Anda ingin memutar gambar sebesar 180 derajat kemudian letakkan dua nilai ini di tag imageview: -

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

Penjelasan: - scaleX = 1 dan scaleY = 1 repesent itu keadaan normal tetapi jika kita menempatkan -1 pada properti scaleX / scaleY maka akan diputar oleh 180 derajat

Prashant Kumar
sumber
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);

Cara Penggunaan?

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

Anda cukup menggunakan atribut rotasi ImageView

Di bawah ini adalah atribut dari ImageView dengan detail dari sumber Android

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