端口CGAffine从iOS转换为Android

时间:2013-12-11 07:29:18

标签: android ios

我有下一组值:

0.439353, -0.073688, 0.078788, 0.439353, 139.500000, 72.000000
Let's name the values: a, b, c, d, tx, ty

在iOS版应用中,这些值会发送到此对象 see here

在我的Android应用中,我正在尝试这样的事情:

Matrix mtx = new Matrix();
mtx.setValues(new float[] { a,  c, tx,  b,  d,  ty,  0,  0, 1});

取自 this 帖子,在Android中,Matrix对象接受该顺序中的值(a,c,tx,b,d,ty)而不是iOS版本(a,b,c,d,tx,ty)。

我的问题是旋转和缩放是否正确完成,但是我遇到了翻译部分的问题。它没有在屏幕上正确定位。任何人都有任何想法,我做错了什么?

修改 我正在使用矩阵在画布上发布位图,就像这样

protected void onDraw(Canvas canvas) {
    // .....
    canvas.drawBitmap(bmp, mtx, null);
}

2 个答案:

答案 0 :(得分:4)

您可以尝试完全替换画布中的矩阵:

Canvas.save();
Canvas.setMatrix(mtx);
Canvas.drawBitmap(bmp, new Matrix(), null);
Canvas.restore();

答案 1 :(得分:3)

原因是iOS根据中心位置计算矩阵,但android和web基于{0,0}位置。所以解决方案是你必须首先将位图移动到相对于屏幕密度的正确比例的中心位置,然后在上应用矩阵。我的Android代码运行良好:

Matrix matrixA = new Matrix();
matrixA.postTranslate(-bitmapWidth/2, -bitmapHeight/2);
matrixA.postScale(screenWidth/320, screenWidth/320);
Matrix matrixB = new Matrix();
matrixB.setValues(new float[]{scale, -rotate, tX, rotate, scale, tY, 0.0F, 0.0F, 1.0F});
matrixA.postConcat(matrixB);

canvas.drawBitmap(bitmap, matrixA, null);

网络css3代码是:

<img style="left: tX; top: tY; transform: matrix(scale, -rotate, rotate, scale, 0, 0) scale(window.screen.width/320);">