从imageview中心点旋转图像

时间:2013-05-13 16:52:05

标签: android android-imageview

我想在android中旋转图像。我发现this useful post并且效果很好,但似乎在android中的旋转从左下角开始。我需要从中心点旋转图像。可能吗?代码相同是有帮助的。 感谢。

6 个答案:

答案 0 :(得分:7)

@ 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对象。从活动中你可以像这样使用它:

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

答案 1 :(得分:3)

这个怎么样(与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);
}

答案 2 :(得分:3)

这对我有用:

RotateAnimation anim= new RotateAnimation(0f,350f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);

//然后设置插值器,持续时间和RepeatCount

yourImageView.startAnimation(anim);

答案 3 :(得分:0)

尝试:

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

它来自同一个答案你提供的链接。

答案 4 :(得分:0)

我有一个库来执行此操作。您可以在此处找到它:https://bitbucket.org/warwick/hg_dial_v2

答案 5 :(得分:0)

上面给出的古德姆答案有效,只要确保在onWindowFocusChanged()活动生命周期回调(而不是onCreate())中获得界限等即可。

因为我们需要确保已渲染视图,getBounds()函数才能正常工作,否则当在0.0中调用这些方法时,我们将获得onCreate()作为这些方法的值。 onWindowFocusChanged()是可以确定的地方。