我想在android中旋转图像。我发现了这篇有用的帖子,效果很好,但似乎 android 中的旋转是从左下角开始的。我需要从中心点旋转我的图像。可能吗?相同的代码很有帮助。谢谢。
6 回答
@goodm 解决方案的问题是 imageView 可能尚未布局,这导致 imageView.getDrawable().getBounds().width() 和 .height() 返回 0。这就是为什么你仍然围绕 0 旋转, 0。解决此问题的一种方法是确保您在布局后使用以下内容创建和应用矩阵:How to set fixed aspect ratio for a layout in Android
@Voicu 的解决方案还可以,但它要求您直接使用可能效率低下的位图。更好的方法可能是直接查询图像资源的大小,而不是实际将其加载到内存中。我使用实用程序方法来执行此操作,它看起来像这样:
public static android.graphics.BitmapFactory.Options getSize(Context c, int resId){
android.graphics.BitmapFactory.Options o = new android.graphics.BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeResource(c.getResources(), resId, o);
return o;
}
这将返回一个包含实际宽度和高度的 Options 对象。从 Activity 你可以像这样使用它:
ImageView img = (ImageView)findViewById(R.id.yourImageViewId);
Options o = getSize(this, R.drawable.yourImage);
Matrix m = new Matrix();
m.postRotate(angle, o.outWidth/2, o.outHeight/2);
img.setScaleType(ScaleType.MATRIX);
img.setImageMatrix(m);
这对我有用:
RotateAnimation anim= new RotateAnimation(0f,350f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
// 然后设置插值器、持续时间和重复计数
yourImageView.startAnimation(anim);
这个怎么样(与goodm的回答略有不同):
public Bitmap rotateImage(int angle, Bitmap bitmapSrc) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(bitmapSrc, 0, 0,
bitmapSrc.getWidth(), bitmapSrc.getHeight(), matrix, true);
}
尝试:
Matrix matrix=new Matrix();
imageView.setScaleType(ScaleType.MATRIX);
matrix.postRotate((float) angle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
imageView.setImageMatrix(matrix);
它来自您提供链接的相同答案。
我有一个这样做的图书馆。你可以在这里找到它:https ://bitbucket.org/warwick/hg_dial_v2
goodm 上面给出的答案有效,只需确保您在onWindowFocusChanged()
活动生命周期回调中获得边界等,而不是onCreate()
.
因为我们需要确保视图已经被渲染,getBounds()
函数才能正常工作,否则我们0.0
在调用它们时会得到这些方法的值onCreate()
。onWindowFocusChanged()
是可以确定的地方。