Порт CGAffineTransform от iOS до Android

У меня есть следующий набор значений:

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

В iOS-версии приложения эти значения отправляются этому объекту см. здесь

В моем приложении для Android я пробую что-то вроде этого:

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

Взятый из этого сообщения, в 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);
}

Ответы

Ответ 1

Причина заключается в том, что iOS вычисляет матрицу на основе позиции center, но андроид и веб-ресурсы основаны на позиции {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);">

Ответ 2

Вы можете полностью заменить матрицу в холсте:

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