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

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.


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


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.


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

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.


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 ().


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


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

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.


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

2

Putar gambar di Android dengan penundaan:

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

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


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


1

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

iv.setRotation(float)

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.


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!


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.


0

tanpa matriks dan animasi:

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

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

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

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

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;

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


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

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" />
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.