1

ヒット テストを実行しようとしているビットマップ イメージがあります。ヒット テストは、通常のビットマップの場合に機能します。しかし、ビットマップを回転およびスケーリングする必要があり、ヒット テストを適切に把握できないようです。

ここでの x と y は、カーソル x と y です。操作されたビットマップ内でカーソル (指で押す) がクリックされたかどうかを確認する必要があります。スケールは正常に動作しているように見えますが、回転は影響していないようです。

float[] pts = new float[4];
float left = m.getX();
float top = m.getY();
float right = left + mBitmaps.get(i).getWidth();
float bottom = top + mBitmaps.get(i).getHeight();
pts[0] = left;
pts[1] = top;
pts[2] = right;
pts[3] = bottom;

float midx = left + mBitmaps.get(i).getWidth()/2;
float midy = top + mBitmaps.get(i).getHeight()/2;

Matrix matrix = new Matrix();
matrix.setRotate(m.getRotation(), midx, midy);
matrix.setScale(m.getSize(), m.getSize(), midx, midy);

matrix.mapPoints(pts);

if(x >= pts[0] && x <= pts[2] && y >= pts[1] && y <= pts[3])
{
    return i;
}
4

1 に答える 1

3

回転後に長方形が座標軸に整列しなくなるため、テストは失敗します。

できるトリックは、カーソル位置を逆変換行列で変換し、変換された位置を元の四角形と比較することです。

Matrix matrix = new Matrix();
matrix.setRotate(m.getRotation(), midx, midy);
matrix.postScale(m.getSize(), m.getSize(), midx, midy);

Matrix inverse = new Matrix();
matrix.invert(inverse);
pts[0] = x;
pts[1] = y;
inverse.mapPoints(pts);
if(pts[1] >= top && pts[1] <= bottom && pts[0] >= left && pts[0] <= right)
{
    return i;
}
于 2013-01-14T05:53:32.847 に答える