Android:通过一个angular度在imageview中旋转图像

我正在使用下面的代码在ImageView中旋转一个angular度。 有没有更简单和不太复杂的方法可用。

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

另一个简单的方法来旋转一个ImageView
更新:
所需导入:

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

代码:(假设pivotXanglepivotXpivotY已经被定义)

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

这种方法不需要每次都创build一个新的位图。

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

API> = 11的mImageView.setRotation(angle)

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

 android:rotation="90" 

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

有两种方法可以做到这一点:

1使用Matrix创build一个新的位图:

 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在要旋转的View上使用RotateAnimation ,并确保将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:

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

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

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

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

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

绝对,我的意思是你可以反复调用这个函数,而不必跟踪当前的旋转。 意思是,如果我通过传递15FsetRotation()方法进行旋转,然后再用30F调用setRotation() ,则图像的旋转angular度是30度,而不是45度。

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

试试这个自定义视图

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

这里有一个很好的解决scheme,为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); 

另一种select:

 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解决scheme

可悲的是,我不认为这是事实。 Matrix类负责所有的图像操作,无论是旋转,缩小/增长,倾斜等。

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

我的道歉,但我想不出一个select。 也许其他人也许能够,但是我不得不操纵一个我用过Matrix的图像。

祝你好运!

另一个可能的解决scheme是创build自己的自定义图像视图(比如RotateableImageView extends ImageView )…并重写onDraw()以旋转canvas/位图,然后重新绘制到canvas。不要忘记还原canvas。

但是如果你只想旋转一个图像视图的实例,你的解决scheme应该足够好。

没有matrix和animation:

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

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