Android:以一定角度在imageview中旋转图像

时间:2012-01-24 04:00:00

标签: android bitmap rotation imageview

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

25 个答案:

答案 0 :(得分:186)

旋转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 矩阵并在 imageView 上设置它)   触摸侦听器中的部分 ACTION_MOVE 部分。

答案 1 :(得分:158)

mImageView.setRotation(angle) API> = 11

答案 2 :(得分:59)

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

android:rotation="90"

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

答案 3 :(得分:42)

有两种方法可以做到:

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

答案 4 :(得分:8)

我知道这是一个疯狂的迟到,但它对我有帮助,所以它可以帮助别人。

从API 11开始,您可以使用15F方法以编程方式设置ImageView的绝对旋转。

绝对地,我的意思是你可以反复调用这个函数,而不必跟踪当前的旋转。这意味着,如果我通过将setRotation()传递给setRotation()方法进行旋转,然后再次使用30F调用Option Explicit Option Base 0 '<~~this is the default but I've included it because it has to be 0 Function numberParse(str As String, _ Optional ndx As Integer = 0, _ Optional delim As String = "; ") As Variant Dim n As Long, nums() As Variant Static rgx As Object, cmat As Object 'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF If rgx Is Nothing Then Set rgx = CreateObject("VBScript.RegExp") Else Set cmat = Nothing End If numberParse = vbNullString With rgx .Global = True .MultiLine = True .Pattern = "[0-9]{4}" If .Test(str) Then Set cmat = .Execute(str) If CBool(ndx) Then 'pull the index of the array of matches numberParse = cmat.Item(ndx - 1) Else 'resize the nums array to accept the matches ReDim nums(cmat.Count - 1) 'populate the nums array with the matches For n = LBound(nums) To UBound(nums) nums(n) = cmat.Item(n) Next n 'convert the nums array to a delimited string numberParse = Join(nums, delim) End If End If End With End Function ,则图像的旋转角度为30度,而不是45度。

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

答案 5 :(得分:5)

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

<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()方法。

答案 6 :(得分:3)

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

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

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

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

答案 7 :(得分:2)

也可以这样:-

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

got from here.

答案 8 :(得分:2)

我认为最好的方法:)

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

答案 9 :(得分:2)

我有一个solution。 实际上它是旋转后出现的问题的解决方案(矩形图像不适合ImagView) 但它也涵盖了你的问题.. 虽然这个解决方案的动画效果更好或更差

    int h,w;
    Boolean safe=true;

在初始化活动时无法获取imageView的参数 为此,请参阅此solution 在按钮的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中添加另一个三元运算符。 / p>

答案 10 :(得分:1)

您可以简单地使用ImageView的旋转属性

以下是ImageView的属性,其中包含Android来源的详细信息

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

答案 11 :(得分:1)

如果您只想直观地旋转视图,可以使用:

{{1}}

答案 12 :(得分:1)

这是一个很好的解决方案,可以为imageView放置一个旋转的drawable:

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解决方案here

答案 13 :(得分: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);
    }
}

答案 14 :(得分:0)

在你的onactivityResult中写下这个

package bar

import foo._ // something nice and short that doesn't reference individual value classes

val x: FStream = ???
x.makeSuperFoo() // should work
x.makeHyperFoo() // should work

答案 15 :(得分:0)

尝试使用此代码100%正常工作;

在旋转按钮上单击编写此代码:

TraceWebFilter

答案 16 :(得分:0)

没有矩阵和动画:

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

答案 17 :(得分: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);

答案 18 :(得分:0)

按照以下答案连续旋转imageview

.addView()

如果点击了旋转按钮

int i=0;

答案 19 :(得分:0)

另一种可能的解决方案是创建自己的自定义图像视图(比如说RotateableImageView extends ImageView)...并覆盖onDraw()以旋转画布/位图,然后再回到画布上。别忘了恢复画布。

但是,如果您只想旋转一个图像视图实例,那么您的解决方案应该足够好了。

答案 20 :(得分:0)

在android中延迟旋转图像:

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

答案 21 :(得分:0)

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

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

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

答案 22 :(得分:0)

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

如何使用?

"use strict"
import React from "react";

var $ = require("jquery")
var typed = require("typed.js")


$(function() {
  typed.typed( {
    strings: ["Text Data", "More Text Data"],
    typeSpeed: 70,
    backSpeed: 75,
    loop: true,
  });
});

export default function AboutMe( {typed}) {
  return (
    <div className="AboutMe">
      <h1>I am <span id="typed"></span>
      </h1>
    </div>
  );
}

答案 23 :(得分:0)

对于Kotlin,

mImageView.rotation = 90f //angle in float

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

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

答案 24 :(得分:0)

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

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

道歉,但我想不出另类。也许其他人可能会这样,但是我不得不操纵我用过Matrix的图像。

祝你好运!