Android:imageviewで画像を角度回転


154

次のコードを使用して、ImageViewで画像を角度回転させています。より簡単で複雑でない方法はありますか?

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年のPSでは、Android StudioでXMLに「回転」を簡単に設定できるようです。(「テキスト」レイアウトを使用して
わずらわしい

ここで答えを見つけてください。stackoverflow.com/a/52983423/5872337
Geet Thakur

回答:


194

回転するもう1つの簡単な方法ImageView
UPDATE:
必要なインポート:

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

コード:(仮定するとimageViewanglepivotXpivotYすでに定義されています)

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

この方法では、毎回新しいビットマップを作成する必要はありません。

注:実行時ImageViewオンタッチを回転するには、タッチリスナーACTION_MOVE部分の上記のコードセクションにある最後の2行を追加して、onTouchListenerをオンにしてImageView回転させます(つまり、postRotateマトリックスとimageViewに設定します)。


109
ここでは完全を期すために基づいてラインでImageViewの値は:matrix.postRotate( 180f, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
ステファン・ホス

2
すべてのタッチイベントでimageviewを回転させる方法は?
Saurabh 2013年

14
私にとって、relativeLayoutで回転した場合、imageViewは含まれている画像のサイズに成長し、レイアウトに適合しなくなります。誰かがこれを解決する方法の経験がありますか?
マキボ2013

7
注:これを機能させるには、ImageViewsrc属性を設定する必要があります。ではなくの属性をgetDrawable()設定したことに気づくまで、私はnullを返していました。facepalmImageViewbackgroundsrc
Gary S.

1
imageviewでのみ画像を回転します。画像自体を回転させるにはどうすればよいですか?
Ege 2014年

177

mImageView.setRotation(angle) API> = 11


3
また、ビューの幅と高さを正しいサイズに変更しますか?それとも、見た目だけが変わるのですか?
Android開発者

5
回転中に「回転アニメーション」を作成する方法はありますか?
Ivan Morgillo 2014年

13
で、あなたは見ることができ@IvanMorgillo ViewPropertyAnimatorのように使用され、aView.animate().rotation(20).start()
Jokester

5
@IvanMorgillo:を使用しrotationBy()ます。たとえば、view.animate().rotationBy(180f).start()。ただし、続けてビューをクリックすると問題が発生します。
Mangesh

このコードをボタンで使用しています。最初のクリックは問題ありませんが、次のクリックはもう回転しません。これを修正するために別の行を追加する必要がありますか?
Eggakin Baconwalker 16

73

API 11以降をサポートしている場合は、次のXML属性を使用できます。

android:rotation="90"

Android Studio xmlプレビューでは正しく表示されない可能性がありますが、期待どおりに動作します。


3
XMLプレビューに関するヒントは私に大いに役立ちました
ngu

ローテーションを適用した後、XMLプレビューが正しく表示されます。
ディックルーカス

これによりビューは回転しますが、画像は回転しません。これにより、画像の横に空白の領域が追加されます。を追加しbackgroundて、効果を確認してください。
YBrush

43

それには2つの方法があります。

1を使用Matrixして新しいビットマップを作成します。

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使用RotateAnimation上のView回転させたい、としてくださいアニメーションのセットを作るためにfillAfter=trueduration=0と、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"
/>

コードでアニメーションを膨らませる:

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

danx ..しかし、動的にセットD角に表示dynamically..iの平均に... RotateAnimationを行うにはdere NYの方法です
rijinrv

これは、回転する必要がある画像がListViewにある場合、受け入れられた回答よりもうまく機能します
Daren

9

私はこれがめちゃくちゃ遅いことを知っていますが、他の人を助けるために私にとっては役に立ちました。

API 11以降では、プログラムを使用してImageViewの絶対回転を設定できます。 imageView.setRotation(angleInDegrees);メソッド。

絶対的に言うと、現在の回転を追跡する必要なく、この関数を繰り返し呼び出すことができます。つまり15FsetRotation()メソッドに渡して回転setRotation()30F、再度で呼び出した場合、画像の回転は45度ではなく30度になります。

注:これは、ImageViewだけでなく、Viewオブジェクトのすべてのサブクラスで実際に機能します。


回転中の私の画像はページ上で自然に少し高くなります。どうすれば設定できますか?
知りたい

画像は適切に中央揃えされていますか?あなたのイメージに透明度の不均一な量を持っている場合は、回転が回転するとき、それは変更の位置に表示される可能性があります
thomaspsk

いいえ、画像が回転すると軸が使用されます。あなたの携帯電話をあなたの手の垂直位置に想像してください、今それを水平に回転させます。もう手を触れない。だからスペースがあります...しかし、私はsetPivotX()を使用してそれを解決しました
知りたい

5

これはRotatableImageViewの私の実装です。使い方は非常に簡単です:ちょうどコピーattrs.xmlRotatableImageView.javaをプロジェクトにとあなたのレイアウトにRotatableImageViewを追加します。example: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>

画像の表示に問題がある場合は、RotableableViewView.onDraw()メソッドのコードを変更するか、代わりにdraw()メソッドを使用してください。


1
非常に役立ちます。共有してくれてありがとう!
Stefan Hoth 2012

RotatableImageViewの使用中にNullPointerExceptionが発生しました。protected void onMeasure(int widthMeasureSpec、int heightMeasureSpec){int w = getDrawable()。getIntrinsicWidth(); ...}ところで、私はそれをコードではなく(そして与えられたデフォルトの画像を使って)使用しましたが、xmlでは使用していませんでした。
RRTW

このimageViewをgridViewで使用すると、奇妙な問題が発生します。スクロールするまで見えなくなります。
Android開発者


3

また、ImageViewを垂直または水平に180度回転する場合は、scaleYまたはscaleXプロパティを使用して、に設定できます-1f。Kotlinの例を次に示します。

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

1f 値は、ImageViewを通常の状態に戻すために使用されます。

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

2

私が持っている解決策これまでに。実際には、回転後に発生する問題の解決策です(四角形の画像はImagViewに適合しません)が、問題もカバーしています。この解決策には、良くも悪くもアニメーションがありますが

    int h,w;
    Boolean safe=true;

ImageViewののパラメータを取得すると、これを参照してくださいそうするために活動の初期化時に可能ではない解決策 ORこのようにボタンのonClickのに寸法を設定します

    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を回転させたいときに実行されるコード

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

この解決策は、上記の問題には十分です。必要がない場合でも(高さが幅よりも小さい場合)、imageViewは縮小されます。問題がある場合は、scaleX / scaleY内に別の三項演算子を追加できます。


2

私は最良の方法だと思います:)

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

2

Androidで画像を遅延させて回転させる:

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

1

カスタムビューでこれを試してください

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

これは、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;
}

使用法:

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

別の選択肢:

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

また、ビットマップを回転させたいがOOMを恐れている場合は、ここで作成したNDKソリューションを使用できます。


1

ビューを視覚的に回転させるだけの場合は、以下を使用できます。

iv.setRotation(float)

1

コトリンの場合、

mImageView.rotation = 90f //angle in float

画像を回転するのではなく、imageViewを回転します

また、Viewクラス内のメソッドですが。そのため、それを使用してほとんどすべてのビューを回転させることができます。


0

残念ながらありません。のMatrixクラスは、それが斜行、成長/縮小、回転のかどうか、などを全ての画像操作のために責任があります

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

申し訳ありませんが、代替案は考えられません。たぶん他の誰かができるかもしれませんが、私が画像を操作しなければならなかったときは、マトリックスを使用しました。

がんばって!


0

もう1つの可能な解決策は、独自のカスタム画像ビュー(たとえばRotateableImageView extends ImageView)を作成し、onDraw()をオーバーライドして、キャンバスに戻る前にキャンバス/ビットマップを回転させることです。キャンバスを元に戻すことを忘れないでください。

しかし、イメージビューの単一のインスタンスのみを回転させる場合は、ソリューションで十分です。


0

マトリックスなしでアニメーション:

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

0

これを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); 

0

このコードを100%動作させてみてください。

回転ボタンをクリックしてこのコードを書きます:

        @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

画像をビットマップに変換してから回転するのではなく、以下のコードのように直接画像ビューを回転してみてください。

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

imageviewの連続回転については、以下の回答に従ってください

int i=0;

回転ボタンがクリックされた場合

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

0

画像を180度回転したい場合は、次の2つの値をimageviewタグに入れます。

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

説明:-scaleX = 1およびscaleY = 1は通常の状態ですが、scaleX / scaleYプロパティに-1を指定すると、180度回転します。


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

使い方?

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の回転属性を使用することができます

以下はImageViewの属性で、Androidソースの詳細が含まれています

<!-- rotation of the view, in degrees. -->
<attr name="rotation" format="float" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.