2013-05-09 69 views
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; 

回答

5

对于那些有兴趣,我结束了设置 “规模” 和 “镜子” 矩阵是这样的:

  1. matrix.setScale(比例因子,比例因子); // value between 0..1
  2. matrix.postScale(-1,1,offsetX,offsetY); //垂直翻转并向右偏移
  3. matrix.postTranslate(dx,dy); //最终矩阵位置 - 对我来说“底部中心对齐”