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);
#1 楼
旋转ImageView
的另一种简单方法:更新:必需的导入:
import android.graphics.Matrix;
import android.widget.ImageView;
代码:(假设
imageView
,angle
,pivotX
和pivotY
已经定义)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=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);
评论
但是,这是在视图上动态进行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度,则可以使用scaleY
或scaleX
属性并将它们设置为-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);
}
}
评论
PS for 2014,看来您可以在Android Studio中的XML中简单地设置“旋转”。 (如果您无法使用“文本”布局,那么您甚至可以单击右侧的“专家属性”按钮!)在这里找到答案。 stackoverflow.com/a/52983423/5872337