我正在使用以下代码将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);


评论

PS for 2014,看来您可以在Android Studio中的XML中简单地设置“旋转”。 (如果您无法使用“文本”布局,那么您甚至可以单击右侧的“专家属性”按钮!)

在这里找到答案。 stackoverflow.com/a/52983423/5872337

#1 楼

旋转ImageView的另一种简单方法:更新:
必需的导入:

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


此方法不需要每次都创建一个新的位图。


注意:要在运行时在ontouch上旋转ImageView,您可以
ImageView上设置onTouchListener并通过添加最后两行
来旋转它(即postRotate矩阵和set在imageView上)在触摸侦听器ACTION_MOVE部分的上述代码
部分中。

评论


为了完整起见,以下是基于ImageView值的行:matrix.postRotate(180f,imageView.getDrawable()。getBounds()。width()/ 2,imageView.getDrawable()。getBounds()。height()/ 2) ;

– Stefan Hoth
2012年9月12日在22:14

如何在每次触摸事件时旋转imageview?

–索拉布
13年1月23日在13:05

对我来说,如果在relativeLayout中旋转,则imageView会增长到所包含图像的大小,不再适合布局。有没有人有解决此问题的经验?

–Makibo
13年4月25日在3:42

注意:要使此方法起作用,您必须设置ImageView的src属性。 getDrawable()为我返回null,直到我意识到我已经设置了ImageView的background属性而不是src。面容

–加里·S。
2014年1月2日15:32

它仅在imageview中旋转图像。我也应该怎么做才能旋转图像本身?

–时代
2014年5月6日在21:49

#2 楼

使用API​​> = 11
mImageView.setRotation(angle)

评论


是否还会将视图的宽度和高度更改为正确的大小?还是仅改变外观?

– Android开发人员
2014年1月27日在8:28

有没有办法在旋转时产生“旋转动画”?

–伊凡·莫吉洛(Ivan Morgillo)
14-10-16在12:25

@IvanMorgillo您可以看一下ViewPropertyAnimator,它的用法类似于aView.animate()。rotation(20).start()

–笑话
15年7月10日在4:36

@IvanMorgillo:使用rotationBy()。例如,view.animate()。rotationBy(180f).start()。但是,如果连续单击该视图,则会出现问题。

–孟格斯
15年8月29日在10:32

我在按钮中使用此代码。第一次单击是可以的,但接下来的单击将不再旋转。我是否应该再改行来解决此问题?

–Eggakin培根行者
16年8月25日在20:00

#3 楼

如果您支持API 11或更高版本,则可以使用以下XML属性:

android:rotation="90"


它可能无法在Android Studio xml预览中正确显示,但可以工作符合预期。

评论


有关xml预览的提示对我帮助很大

– ngu
2015年12月10日在18:58

应用旋转后,XML预览正确显示给我。

–迪克·卢卡斯(Dick Lucas)
18年7月24日在16:50

这将旋转视图,但不会旋转图像!这将在图像旁边添加空白区域。只需添加背景即可看到效果。

– YBrush
19 Mar 8 '19在9:33

#4 楼

有两种方法:

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进行旋转,并确保将Animation设置为fillAfter=trueduration=0fromDegrees=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);


评论


但是,这是在视图上动态进行RotateAnimation的任何方法。我的意思是动态设置d角。

– rijinrv
2012年1月26日上午7:00

如果您需要旋转的图像位于ListView中,则此方法比可接受的答案更好

–达人
2014年3月7日,0:03

#5 楼

我知道这太疯狂了,但这对我很有帮助,因此可能对其他人有帮助。

从API 11开始,您可以使用imageView.setRotation(angleInDegrees);方法以编程方式设置ImageView的绝对旋转。

绝对来说,我的意思是您可以重复调用此函数而不必跟踪当前的旋转。意思是,如果我通过将15F传递给setRotation()方法来旋转,然后再次使用setRotation()调用30F,则图像的旋转角度为30度,而不是45度。

注意:这实际上适用于View对象的任何子类,而不仅仅是ImageView。

评论


我旋转时的图像在页面上自然会高一点。如何设置下来?

–我想知道
18年2月13日在14:41

您的图像是否正确居中?如果图像的透明度不均匀,旋转时可能会导致图像看起来位置改变

– thomaspsk
18年2月13日在18:09

没有人,当图像旋转时,它使用轴。想象您的手机在手上处于垂直位置,现在将其旋转到水平位置。它不再碰你的手。所以有一个空间...但是我通过使用setPivotX()解决了

–我想知道
18年2月13日在23:17

#6 楼

这是我的RotatableImageView的实现。使用非常简单:只需将attrs.xml和RotatableImageView.java复制到您的项目中,然后将RotatableImageView添加到您的布局中。使用示例:angle参数设置所需的旋转角度。 )方法。

评论


很有帮助。感谢分享!

– Stefan Hoth
2012年9月12日在22:15

使用RotatableImageView时出现NullPointerException。受保护的void onMeasure(int widthMeasureSpec,int heightMeasureSpec){int w = getDrawable()。getIntrinsicWidth(); ...}顺便说一句,我在代码中使用了它(并具有给定的默认图像),而不是在xml中使用它。

– RRTW
2012-12-21 13:17



在gridView中使用此imageView时,出现了奇怪的问题。在滚动之前,它一直不可见。

– Android开发人员
2014年1月27日在8:07

#7 楼

也可以这样进行:-

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


从这里获取。

评论


谢谢!非常简单快捷

– zinonX
5月4日20:39

#8 楼

对于Kotlin,

mImageView.rotation = 90f //angle in float


这将旋转imageView而不是旋转图像

,尽管它是View类中的方法。因此,您几乎可以使用它旋转任何视图。

#9 楼

我有一个解决方案。
实际上,这是旋转后出现的问题的解决方案(矩形图像不适合ImagView),但它也涵盖了您的问题。.
解决方案具有“动画”,无论好坏,

    int h,w;
    Boolean safe=true;


在活动初始​​化时无法获取imageView的参数
要这样做,请参考此解决方案
或在按钮的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(即使不必要)(当高度小于Width时)。如果麻烦,您可以添加另一个三元scaleX / scaleY内部的运算符。

#10 楼

另外,如果要将ImageView垂直或水平旋转180度,则可以使用scaleYscaleX属性并将它们设置为-1f。这是一个Kotlin示例:

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


1f值用于将ImageView返回其正常状态:

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


#11 楼

延迟在android中旋转图像:

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


#12 楼

我认为最好的方法:)

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


#13 楼

在自定义视图上尝试一下

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




#14 楼

这是为图像视图放置旋转的可绘制对象的一种很好的解决方案:

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


此外,如果您希望旋转位图,但又害怕OOM,则可以使用我在这里制作的NDK解决方案

#15 楼

如果只想视觉旋转视图,则可以使用:

iv.setRotation(float)


#16 楼

您可以简单地使用Image View的旋转属性
以下是ImageView的属性,其中包含Android来源的详细信息
<!-- rotation of the view, in degrees. -->
<attr name="rotation" format="float" />


#17 楼

可悲的是,我认为没有。 Matrix类负责所有图像操作,无论它是旋转,收缩/增长,倾斜等。

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

我很抱歉,但我想不出另一种选择。也许其他人也许可以,但是我不得不操纵图像的时候我使用了矩阵。

祝你好运!

#18 楼

另一种可能的解决方案是创建您自己的自定义图像视图(例如RotateableImageView extends ImageView)...并覆盖onDraw()以在重新放置到画布上之前旋转画布/位图。请不要忘记恢复画布。 />
但是如果仅旋转图像视图的单个实例,则您的解决方案应该足够好。

#19 楼

没有矩阵且没有动画:

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


#20 楼

只需将其写在您的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); 


#21 楼

尝试此代码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);
            }
        }


#22 楼

而不是将图像转换为位图然后旋转,请尝试像下面的代码那样旋转直接的图像视图。


#23 楼

按照以下答案连续旋转图像视图

int i=0;


如果单击旋转按钮

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


#24 楼

如果您想将图像旋转180度,则将这两个值放在imageview标签中:-

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


说明:-scaleX = 1和scaleY = 1表示正常状态,但如果将scaleX / scaleY属性设置为-1,则它将旋转180度

#25 楼

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