对矩阵操纵矩形进行测试

时间:2013-01-14 04:36:21

标签: android matrix

我有一个位图图片,我正在尝试进行点击测试。如果它只是一个普通的位图,则命中测试有效。但我需要旋转和缩放位图,我似乎无法正确地找出命中测试。

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

1 个答案:

答案 0 :(得分: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;
}