Android : 이미지 뷰에서 이미지를 각도로 회전


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
PS for 2014, Android Studio의 XML에서 단순히 "회전"을 설정할 수있는 것처럼 보입니다. ( '텍스트'레이아웃을 사용하여 귀찮게 할 수없는 경우 오른쪽의 "전문가 속성"버튼을 클릭하기
만하면됩니다

여기에서 답을 찾으십시오. stackoverflow.com/a/52983423/5872337
Geet Thakur

답변:


194

ImageView: 회전하는 또 다른 간단한 방법 :
UPDATE :
필수 가져 오기 :

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

코드 : (가정 imageView, angle, pivotXpivotY이미 정의되어 있습니다)

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

이 방법은 매번 새 비트 맵을 만들 필요가 없습니다.

참고 :로는 회전 ImageViewontouch 설정할 수있는 런타임에 onTouchListener을ImageView&가 (즉, 마지막 두 줄을 추가하여 회전 postRotate 매트릭스가에 설정 이미지 뷰 터치 리스너에서) 위의 코드 섹션을 ACTION_MOVE의 일부입니다.


109
완성도를 위해 다음과 같은 ImageView값을 기준으로 한 라인이 있습니다.matrix.postRotate( 180f, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
Stefan Hoth

2
모든 터치 이벤트에서 이미지 뷰를 회전시키는 방법은 무엇입니까?
Saurabh

14
나를 위해, relativeLayout에서 회전하면 imageView가 더 이상 레이아웃에 맞지 않고 포함 된 이미지의 크기로 커집니다. 이 문제를 해결하는 방법을 경험 한 사람이 있습니까?
Makibo

7
참고 : 이것이 작동하려면 ImageViewsrc속성 을 설정해야 합니다. 대신 의 속성을 getDrawable()설정했음을 깨달을 때까지 null을 반환했습니다 . facepalmImageViewbackgroundsrc
게리 S.

1
이미지 뷰에서만 이미지를 회전시킵니다. 이미지 자체를 회전 시키려면 어떻게해야합니까?
Ege

177

mImageView.setRotation(angle) API> = 11


3
뷰의 너비와 높이를 올바른 크기로 변경합니까? 아니면 모양 만 바뀔까요?
안드로이드 개발자

5
회전하는 동안 "회전 애니메이션"을 사용하는 방법이 있습니까?
Ivan Morgillo

13
@IvanMorgillo 당신은 다음 ViewPropertyAnimator과 같이 사용되는 것을 볼 수 있습니다aView.animate().rotation(20).start()
Jokester

5
@IvanMorgillo : 사용하십시오 rotationBy(). 예를 들면 다음과 같습니다 view.animate().rotationBy(180f).start(). 그러나 뷰를 연속적으로 클릭하면 문제가됩니다.
Mangesh

이 코드를 버튼으로 사용하고 있습니다. 첫 번째 클릭은 정상이지만 다음 클릭은 더 이상 회전하지 않습니다. 이 문제를 해결하기 위해 다른 줄을 넣어야합니까?
Eggakin Baconwalker

73

API 11 이상을 지원하는 경우 다음 XML 속성을 사용할 수 있습니다.

android:rotation="90"

Android Studio xml 미리보기에서는 올바르게 표시되지 않을 수 있지만 예상대로 작동합니다.


3
xml 미리보기에 관한 힌트는 많은 도움이되었습니다
ngu

회전이 적용된 후 XML 미리보기가 올바르게 표시됩니다.
Dick Lucas

뷰가 회전하지만 이미지는 회전하지 않습니다! 이미지 옆에 빈 영역이 추가됩니다. background효과를 보려면 a 를 추가 하십시오.
YBrush

43

이를 수행하는 두 가지 방법이 있습니다.

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=true, duration=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 뉴욕의 방법입니다
rijinrv

회전해야하는 이미지가 ListView에있는 경우 허용되는 답변보다 더 잘 작동합니다.
Daren

9

나는 이것이 미치게 늦다는 것을 알고 있지만 나에게 도움이되어 다른 사람들을 도울 수 있습니다.

API 11부터는 imageView.setRotation(angleInDegrees);메소드 를 사용하여 프로그래밍 방식으로 ImageView의 절대 회전을 설정할 수 있습니다 .

절대적으로 현재 회전을 추적하지 않고도이 함수를 반복해서 호출 할 수 있습니다. 15F즉, setRotation()메서드 를 전달 하여 회전 한 다음 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>

이미지를 표시하는 데 문제가 있으면 RotatableImageView.onDraw () 메서드 에서 코드를 변경 하거나 draw () 메서드를 대신 사용하십시오.


1
매우 도움이됩니다. 공유해 주셔서 감사합니다!
Stefan Hoth

RotatableImageView를 사용하는 동안 NullPointerException이 발생했습니다. protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {int w = getDrawable (). getIntrinsicWidth (); ...} BTW, 나는 그것을 XML이 아닌 코드에서 (그리고 주어진 기본 이미지를 가지고) 사용했다.
RRTW December

이 imageView는 gridView에서 사용될 때 이상한 문제가 있습니다. 스크롤 할 때까지 계속 보이지 않습니다.
안드로이드 개발자


3

또한 ImageView를 세로 또는 가로 로 180도 회전하려는 경우 scaleY또는 scaleX속성을 사용하여 속성을 설정할 수 있습니다 -1f. 다음은 Kotlin 예제입니다.

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

1f value는 ImageView를 정상 상태로 되 돌리는 데 사용됩니다.

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

2

나는 이것에 대한 해결책 을 가지고있다 . 실제로 회전 후 발생하는 문제에 대한 해결책입니다 (사각형 이미지는 ImagView에 맞지 않습니다). 그러나 그것은 또한 문제를 다루고 있습니다.

    int h,w;
    Boolean safe=true;

그래서이를 참조하십시오 활동의 초기화에 가능한 이미지 뷰의 매개 변수를하지 않는 얻기 할 수있는 솔루션 또는 이 같이 버튼의 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

지연없이 안드로이드에서 이미지 회전 :

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

또 다른 가능한 해결책은 사용자 정의 이미지보기 (예 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

이미지 뷰의 연속 회전을 위해서는 아래 답변을 따르십시오

int i=0;

회전 버튼을 클릭하면

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

0

이미지를 180도 회전하려면 다음 두 값을 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의 회전 속성을 간단히 사용할 수 있습니다

아래는 Android 소스의 세부 정보가 포함 된 ImageView의 속성입니다.

<!-- rotation of the view, in degrees. -->
<attr name="rotation" format="float" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.