Android缩放位图图像

时间:2011-09-01 21:09:30

标签: android canvas matrix image-manipulation scale

我的应用程序在3x3网格中有9个位图图像。所有这些都在屏幕上显示,并且根据用户与它们的交互方式(点按,双击,捏合,缩放,拖动),“动作上”的图像需要执行不同的任务。

例如,如果我点击一个图像,它需要完全围绕它的垂直访问旋转,然后停止。

目前我正在使用带有onTouchEvent(..)方法的SurfaceView。我认为我可以设置动画的方法是将图像的宽度从1缩放到-1再回到1.我一直在尝试使用矩阵,但我无法让图像保持居中的位置。请帮我解决这个问题或建议一种替代/更好的方法来实现这一点。

我目前的代码只是一个测试。如果 b 为真,则该方法将尝试缩放位图。如果 b 为false,则会正常绘制位图。

public void doDraw(Canvas canvas, boolean b)
{
    Matrix m = new Matrix();

    float scale = .5f;
    m.setScale(scale, 1f);
    m.postTranslate(mX,mY);

    if(!b)
        canvas.drawBitmap(mBitmap, mX, mY, null);
    else
        canvas.drawBitmap(mBitmap, m, null);
}

1 个答案:

答案 0 :(得分:1)

尝试使用此代替postTranslate

matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);

其中centerX,Y是位图的中心

<强>更新

你可以在android上使用graphics.camera来转换矩阵。访问摄像头到主视图(网格)并覆盖getChildStaticTransformation。获取转换矩阵。 t.getMatrix()并改变那一个。您可以将其移动到任何您想要的位置,因为这是主视图中的矩阵,但仅用于渲染该特定孩子。

所以做那样的事情

@Override
    protected boolean getChildStaticTransformation(View child, Transformation t) {
        Matrix matrix = t.getMatrix();
            int centerX = (child.getWidth() / 2);
            int centerY = (child.getHeight() / 2);
        t.clear();
        t.setTransformationType(Transformation.TYPE_MATRIX);
        mCamera.save();

        if (child == getChildAt(0)) {
            mCamera.translate(pixels to the right,pixels to the bottom,
                    to the z axis);
            mCamera.getMatrix(matrix);
            mCamera.restore();
            matrix.preTranslate(-centerX, -centerY);
            matrix.postTranslate(centerX, centerY);

        } 

        return true;
    }

也不要忘记设置setStaticTransformationsEnabled(true);某个地方到网格的构造函数