2013-05-09 2 views
3

Я играю анимацию, где все кадры одинаковой высоты, но различной ширины. Все хорошо, но я хотел бы применить некоторые преобразования, используя матрицу для лучшей производительности.Матричное зеркало и масштаб

На первом кадре:

  • Я случайно решить, если я хочу, чтобы применить зеркальную матрицу
  • измерить высоту, чтобы увидеть, если мне нужно, чтобы применить шкалу вниз матрицу.

Ниже приведен код, который почти работает. Как-то это не согласовано, а рамки иногда центрируются и иногда смещаются. У меня нет опыта работы с матрицами, поэтому я был бы признателен, если кто-то с большим количеством знаний может подтвердить/исправить/улучшить процедуру преобразования. Эта матрица поставляется с методом рисования холста.

Кроме того, я хотел бы контролировать:

  • если масштаб вниз требуется масштаб вплоть до точной высоты (высота моего единственного значение ориентации)
  • может матрицу использоваться таким образом, чтобы все кадры будут нарисованы дно-центр?

редактировать: Я предполагаю, что я могу контролировать точное масштабирование вниз размер и нижнее положение центра с screenRect (назначения Rect)?

Basic урезанного кода:

RectF screenRect = new RectF(0, 0, ((float) displayWith), ((float) displayHeight)); 

Matrix mirror = null; 
if (isMirror) { 
    mirror = new Matrix(); 
    mirror.setScale(-1, 1); 
    mirror.postTranslate(p.x, 0); // position X back to original point 
} 

Matrix scale = null; 
if (isScaleDown) { // down-scale 
    scale = new Matrix(); 
    scale.setRectToRect(imageRect, screenRect, Matrix.ScaleToFit.CENTER);   
}    

// COMBINED TRANSFORMATION MATRIX 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

Matrix trans = null; 
if (scale != null) trans = scale; 
if (mirror != null && trans == null) trans = mirror; 
if (mirror != null && trans != null) trans.setConcat(trans, mirror); 
return trans; 

ответ

5

Для тех, кто заинтересован, я закончил настройку "масштаба" и "зеркала" матрицы таким образом:

  1. matrix.setScale (scaleFactor, scaleFactor); // значение между 0..1
  2. matrix.postScale (-1, 1, offsetX, offsetY); // переворачиваем вертикально и смещаем в правильное положение
  3. matrix.postTranslate (dx, dy); // конечная позиция матрицы - для меня «выравнивание по центру»