3

我正在播放一些动画,其中所有帧的高度相同,但宽度不同。很好,但我想使用矩阵应用一些转换以获得更好的性能。

在第一帧:

  • 我随机决定是否要应用镜像矩阵
  • 我测量高度以查看是否需要应用按比例缩小的矩阵。

下面是几乎可以工作的代码。不知何故,它并不一致,帧有时居中有时偏移。我没有使用矩阵的经验,所以如果有更多知识的人可以确认/修复/改进转换过程,我将不胜感激。该矩阵提供给画布绘图方法。

另外我想控制:

  • 如果需要按比例缩小到精确的高度(高度是我唯一的方向值)
  • 可以使用矩阵以使所有帧都以底部中心绘制吗?

编辑:我想我可以用screenRect(目标矩形)控制精确的缩小尺寸和底部中心位置?

基本精简代码:

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;
4

1 回答 1

5

对于那些感兴趣的人,我最终以这种方式设置了“比例”和“镜像”矩阵:

  1. matrix.setScale(scaleFactor, scaleFactor); // 0..1 之间的值
  2. matrix.postScale(-1, 1, offsetX, offsetY); // 垂直翻转并偏移到正确的位置
  3. 矩阵.postTranslate(dx, dy); // 最终矩阵位置 - 对我来说是“底部中心对齐”
于 2013-06-11T06:48:00.827 回答