我想旋转ImageView图像。这是我的代码:
Matrix mat = new Matrix();
mat.preRotate(90, ivImage.getWidth()/2, ivImage.getHeight()/2);
ivImage.setScaleType(ScaleType.MATRIX);
ivImage.setImageMatrix(mat);
但是当我点击旋转按钮时,不仅图像会旋转,而且它也会缩放,因为位图比ImageView
大。
我知道我可以使用
b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), mat, true);
ivImage.setImageBitmap(b);
但这显然较慢,并且有一些滞后。
所以我的问题是:如何旋转图像而不进行缩放而不重新创建位图?
答案 0 :(得分:3)
以下是我用于将图像旋转到90度的代码。
if(oldAngle == 0){
newAngle = oldAngle + 90;
}
else if(oldAngle == 90)
newAngle = oldAngle - 90;
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
int centerX = layoutParams.leftMargin + (view.getWidth()/2);
int centerY = layoutParams.topMargin + (view.getHeight()/2);
RotateAnimation animation = new RotateAnimation(oldAngle, newAngle, centerX, centerY);
animation.setDuration(0);
animation.setRepeatCount(2);
animation.setFillAfter(true);
view.startAnimation(animation);
oldAngle = newAngle;
希望它能帮到你......
答案 1 :(得分:0)
如何使用XML动画?
<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="1000"
android:startOffset="0"
android:repeatCount="infinite"
/>
然后使用类似的东西;
rotation = AnimationUtils.loadAnimation(this, R.anim.clockwise_rotation);
buttonRefresh.startAnimation(rotation);
PS。这无限旋转。所以需要一些调整。
答案 2 :(得分:0)
使用此
final Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
final Matrix mtx = new Matrix();
mtx.postRotate(n);
rotator = Bitmap.createBitmap(all, 0, 0,
all.getWidth(), all.getHeight(), mtx,
true);
view.setImageBitmap(rotator);
这将随机旋转图像。只需将.nextInt(n)
更改为.nextInt(AnyNumberYouLife)
它快:):
答案 3 :(得分:0)
我发现,就我的目的而言,这是使用Canvas
代替ImageView
的最佳解决方案。为了旋转图像,我选择使用另一个可以找到的库here
答案 4 :(得分:0)
这是一个很好的解决方案,可以为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
答案 5 :(得分:0)
我发现旋转ImageView的最简单方法是执行此操作:
view.animate().rotationBy(degrees);
非常容易实现,android处理所有其余的
希望这有帮助! :)