我使用以下代码在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);
答案 0 :(得分:186)
旋转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 矩阵并在 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=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);
答案 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度,可以使用scaleY
或scaleX
属性并将其设置为-1f
。这是一个Kotlin示例:
imageView.scaleY = -1f
imageView.scaleX = -1f
1f
值用于将ImageView返回其正常状态:
imageView.scaleY = 1f
imageView.scaleX = 1f
答案 7 :(得分:2)
答案 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的图像。
祝你好运!