围绕点旋转图像

时间:2010-06-03 16:50:53

标签: android

我有一个矩形尺寸的图像,例如30 x 60像素  我想围绕图像的底部中心旋转这个图像,即  我想在上面的例子中将枢轴设置为(15,60)像素。

我正在使用drawble和矩阵来完成这项工作,  无论我尝试什么,我总是最终围绕图像的中心旋转。

代码是:

Bitmap bitmapOrg = BitmapFactory.decodeFile("/sdcard/DCIM/2010-06-01_15-32-42_821.jpg");

// float angle =(angle + 10.0f)%360.0f;             if(null!= bitmapOrg)             {

             int width = bitmapOrg.getWidth();
             int height = bitmapOrg.getHeight();
             int newWidth = 15;
             int newHeight = 15;

             // calculate the scale - in this case = 0.4f
             float scaleWidth = ((float) newWidth) / width;
             float scaleHeight = ((float) newHeight) / height;

/ * Canvas c = new Canvas(bitmapOrg);                  float px =;                 浮动;                 c.rotate(angle,px,py)* /

             // createa matrix for the manipulation
             Matrix matrix = new Matrix();
             // resize the bit map
             matrix.postScale(scaleWidth, scaleHeight);
             // rotate the Bitmap

// matrix.postRotate(45);

             // recreate the new Bitmap
             Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
                               width, height, matrix, true); 

             // make a Drawable from Bitmap to allow to set the BitMap 
             // to the ImageView, ImageButton or what ever
             BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);

             ImageView imageView = new ImageView(this);

             // set the Drawable on the ImageView
             imageView.setImageDrawable(bmd);

             // center the Image
             imageView.setScaleType(ScaleType.CENTER);

// imageView.layout(100,300,0,0); // linLayout.addView(imageView);

             // add ImageView to the Layout
             linLayout.addView(imageView, 
                new AbsoluteLayout.LayoutParams(
                           LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 10, 30
                     )
             );

任何人都可以让我知道如何纠正这个问题吗?

2 个答案:

答案 0 :(得分:0)

在进行旋转之前,您是否正在转换到想要旋转的点?

查看此资源: http://blogs.sonyericsson.com/developerworld/2010/05/31/android-tutorial-making-your-own-3d-list-part-2/

答案 1 :(得分:0)

是的,借助矩阵你可以旋转图像。在调用RotateBitmap()之后,您可以使用getBitmap()随时获取位图。

public class RotateBitmap {

public static final String  TAG = "RotateBitmap";
private Bitmap                  mBitmap;
private int                     mRotation;
private int                     mWidth;
private int                     mHeight;
private int                     mBitmapWidth;
private int                     mBitmapHeight;

public RotateBitmap( Bitmap bitmap, int rotation )
{
    mRotation = rotation % 360;
    setBitmap( bitmap );
}

public void setRotation( int rotation )
{
    mRotation = rotation;
    invalidate();
}

public int getRotation()
{
    return mRotation % 360;
}

public Bitmap getBitmap()
{
    return mBitmap;
}

public void setBitmap( Bitmap bitmap )
{
    mBitmap = bitmap;

    if ( mBitmap != null ) {
        mBitmapWidth = bitmap.getWidth();
        mBitmapHeight = bitmap.getHeight();
        invalidate();
    }
}

private void invalidate()
{
    Matrix matrix = new Matrix();
    int cx = mBitmapWidth / 2;
    int cy = mBitmapHeight / 2;
    matrix.preTranslate( -cx, -cy );
    matrix.postRotate( mRotation );
    matrix.postTranslate( cx, cx );

    RectF rect = new RectF( 0, 0, mBitmapWidth, mBitmapHeight );
    matrix.mapRect( rect );
    mWidth = (int)rect.width();
    mHeight = (int)rect.height();
}

public Matrix getRotateMatrix()
{
    Matrix matrix = new Matrix();
    if ( mRotation != 0 ) {
        int cx = mBitmapWidth / 2;
        int cy = mBitmapHeight / 2;
        matrix.preTranslate( -cx, -cy );
        matrix.postRotate( mRotation );
        matrix.postTranslate( mWidth / 2, mHeight / 2 );
    }

    return matrix;
}

public int getHeight()
{
    return mHeight;
}

public int getWidth()
{
    return mWidth;
}

public void recycle()
{
    if ( mBitmap != null ) {
        mBitmap.recycle();
        mBitmap = null;
    }
 }
}