マトリックスを Canvas に連結していますが、後で canvas.getClipBounds() を実行して Canvas の現在のクリップを見つけられるようにしたいと考えています。ただし、canvas.getClipBounds() は (RectF ではなく) Rect を返します。その不正確さが問題を引き起こしていると思います。
したがって、私は独自の RectF を維持し、Canvas が変換されるときにそれを変換して、最終的には canvas.getClipBounds() によって返される値に似た値になるようにしますが、浮動小数点精度になります。
ただし、キャンバスのクリップに canvas.concat(Matrix) がどのように影響するかはわかりません。これは、連結を模倣しようとする試みがうまくいかないためです。以下は、値をコメントとして使用して、私が試しているコードです。temp RectFs の 1 つがm_Canvas.getClipBounds.toString()
連結後の値と同様の値を持つことを期待しますが、私はそうではありません。助言がありますか?
protected void processConcatMatrix(Matrix m)
{
//m.toString() == Matrix{[1103.398, -134.48357, 23.99026][174.76108, 849.0959, -159.39447][0.0, 0.0, 1.0]}
//m_Canvas.getMatrix().toString() == Matrix{[1.0, 0.0, 0.0][0.0, -1.0, 706.0][0.0, 0.0, 1.0]}
//m_Canvas.getClipBounds.toString() == Rect(0, 0 - 1024, 706)
m_Canvas.concat(m);
//m_Canvas.getClipBounds().toString() = Rect(0, 0 - 1, 1);
//m_Canvas.getMatrix().toString == Matrix{[1103.398, -134.48357, 23.99026][-174.76108, -849.0959, 865.3945][0.0, 0.0, 1.0]}
RectF temp = new RectF(0, 0 - 1024, 706);
Matrix m1 = new Matrix(m);
m1.mapRect(temp);
//temp.toString() == RectF(-94921.41, -159.39447, 1129903.5, 778257.6)
//not sure if I should use the parameter matrix, or the canvas matrix after concatentation. let's try with both
RectF temp2 = new RectF(0, 0 - 1024, 706);
Matrix m2 = new Matrix(m_Canvas.getMatrix());
m2.mapRect(temp2);
//temp2.toString() == RectF(-94921.41, -777551.6, 1129903.5, 865.3945)
//maybe I'm supposed to invert the matrices???
RectF temp3 = new RectF(0, 0 - 1024, 706);
Matrix m3 = new Matrix(m);
m3.invert(m3);
m3.mapRect(temp3);
//temp3.toString() == RectF(0.0, 0.0, 1024.0, 706.0)
//not sure if I should use the parameter matrix, or the canvas matrix after concatentation. let's try with both
RectF temp4 = new RectF(0, 0 - 1024, 706);
Matrix m4 = new Matrix(m_Canvas.getMatrix());
m4.invert(m4);
m4.mapRect(temp4);
//temp4.toString == RectF(0.0, 0.0, 1024.0, 706.0)
//ok, none of these values resembled Rect(0, 0 - 1, 1). Clearly I am doing something wrong...
}