3

すべてのフレームが同じ高さで幅が異なるアニメーションを再生しています。大丈夫ですが、パフォーマンスを向上させるために、マトリックスを使用していくつかの変換を適用したいと思います。

最初のフレーム:

  • ミラーマトリックスを適用するかどうかをランダムに決定します
  • 高さを測定して、縮小マトリックスを適用する必要があるかどうかを確認します。

以下は、ほとんど動作するコードです。どういうわけか一貫性がなく、フレームが中央に配置されることもあれば、オフセットされることもあります。私はマトリックスの経験がないので、より多くの知識を持っている人が変換手順を確認/修正/改善できるとありがたいです. この行列は、canvas 描画メソッドに提供されます。

さらに、次のことを制御したいと思います。

  • 縮小が必要な場合は、正確な高さに縮小します(高さは私の唯一の向きの値です)
  • すべてのフレームが下中央で描画されるようにマトリックスを使用できますか?

編集: 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, オフセットX, オフセットY); // 垂直方向に反転し、右の位置にオフセットします
  3. matrix.postTranslate(dx, dy); // 最終的な行列の位置 - 私にとっては「下中央揃え」
于 2013-06-11T06:48:00.827 に答える