获取视图的绘制边界/矩形

3
我正在开发一个应用程序,其中许多视图可以旋转 - 这类似于物理物体的地图。我必须检测两个物体(所有物体都是矩形/正方形)何时重叠,并且用户是否在对象上单击/双击/长按。因此,我需要知道视图的绘制边界。

让我们看看下面的示例图像 - 绿色矩形旋转了45度。我需要获取绿色矩形的4个角的坐标。如果使用view.getHitRect(),它会返回视图的边界框(用红色标记),这对我没有任何用处。

您知道如何获取视图边缘的坐标吗?

我能想到的唯一解决方法是子类化View,手动存储角落的初始坐标,并在每次修改视图-平移、缩放和旋转时计算它们的新值,但我想知道是否有更好的方法。

P.S.该应用程序应在Android 2.3上运行,但也欢迎4.0+的解决方案。

Example situation


请参见我的答案中的Layer.contains方法,链接在这里:https://dev59.com/tXzaa4cB1Zd3GeqPNT3U - pskink
是的,Matrix.mapPoints解决了问题。 - Zheko
1个回答

2

感谢pskink的帮助,我再次探索了Matrix.mapPoints方法,并成功获取了矩形角落的正确坐标。

如果您正在运行Android 3.0+ ,您可以通过调用myView.getMatrix()轻松获取视图矩阵并映射感兴趣的点。我必须使用0,0来表示左上角,使用getWidth(),getHeight() 来表示右下角,并将这些坐标映射到矩阵中。之后,加上视图的X和Y值即可获得角落的真实值。

操作类似于:

float points[] = new float[2];
        points[0] = myView.getWidth();
        points[1] = myView.getHeight();
        myView.getViewMatrix().mapPoints(points);

        Paint p = new Paint();
        p.setColor(Color.RED);
        //offset the point and draw it on the screen
        canvas.drawCircle(center.getX() + points[0], center.getY() + points[1], 5f, p);

如果您需要支持较低版本的Android,可以使用NineOldAndroids。然后,我复制并修改了其中一个内部方法以获取视图的矩阵:

public Matrix getViewMatrix()
{
    Matrix m = new Matrix();
    Camera mCamera = new Camera();

    final float w = this.getWidth();
    final float h = this.getHeight();
    final float pX = ViewHelper.getPivotX(this);
    final float pY = ViewHelper.getPivotY(this);

    final float rX = ViewHelper.getRotationX(this);;
    final float rY = ViewHelper.getRotationY(this);
    final float rZ = ViewHelper.getRotation(this);
    if ((rX != 0) || (rY != 0) || (rZ != 0)) 
    {
        final Camera camera = mCamera;
        camera.save();
        camera.rotateX(rX);
        camera.rotateY(rY);
        camera.rotateZ(-rZ);
        camera.getMatrix(m);
        camera.restore();
        m.preTranslate(-pX, -pY);
        m.postTranslate(pX, pY);
    }

    final float sX = ViewHelper.getScaleX(this);
    final float sY = ViewHelper.getScaleY(this);;
    if ((sX != 1.0f) || (sY != 1.0f)) {
        m.postScale(sX, sY);
        final float sPX = -(pX / w) * ((sX * w) - w);
        final float sPY = -(pY / h) * ((sY * h) - h);
        m.postTranslate(sPX, sPY);
    }

    m.postTranslate(ViewHelper.getTranslationX(this), ViewHelper.getTranslationY(this));

    return m;
}

我把这个方法放在了一个视图的重载类中(在我的情况下是扩展TextView)。从那里开始,它与Android 3.0+中的相同,但是不要调用myView.getMatrix(),而是调用myView.getViewMatrix()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接