Android,如何检查两个旋转视图之间的冲突

Android,如何检查两个旋转视图之间的冲突,android,collision-detection,Android,Collision Detection,我正在尝试将一些文本视图在框架视图中的位置随机化。文本视图也将在0到360度之间进行随机旋转。文本视图不允许相互重叠,这意味着我需要检查冲突(或者至少知道哪些点有效/无效)。我不知道如何检查旋转时两个文本视图之间的冲突。我曾尝试使用Rect intersects,但这并不真正起作用,因为该函数仅在视图没有旋转时才起作用 下面是一个关于我想要什么的例子: TEXT1放在第一位。当TEXT2被放置时,TEXT1和TEXT2周围的绿色边框发生冲突,这意味着不允许将TEXT2放置在那里。但是,TEXT

我正在尝试将一些文本视图在框架视图中的位置随机化。文本视图也将在0到360度之间进行随机旋转。文本视图不允许相互重叠,这意味着我需要检查冲突(或者至少知道哪些点有效/无效)。我不知道如何检查旋转时两个文本视图之间的冲突。我曾尝试使用Rect intersects,但这并不真正起作用,因为该函数仅在视图没有旋转时才起作用

下面是一个关于我想要什么的例子:

TEXT1放在第一位。当TEXT2被放置时,TEXT1和TEXT2周围的绿色边框发生冲突,这意味着不允许将TEXT2放置在那里。但是,TEXT3不会与任何内容冲突,应该允许放置。所以我想检查绿色边框的碰撞,而不是蓝色矩形。我该怎么做

编辑

旋转我正在使用的视图的步骤


为了定位textview,我使用了setX(float)和setY(float)。

我最终得到了以下解决方案,我创建了4个点,每个点对应于textview的每个角,然后以与textview相同的角度旋转。利用这些点,我创建了一条路径,我用它来创建一个区域

private Region createRotatedRegion(TextView textView){
    Matrix matrix = new Matrix();
    matrix.setRotate(textView.getRotation(), textView.getX() + textView.getMeasuredWidth() / 2, textView.getY() + textView.getMeasuredHeight() / 2);

    Path path = new Path();
    Point LT = rotatePoint(matrix, textView.getX(), textView.getY());
    Point RT = rotatePoint(matrix, textView.getX() + textView.getMeasuredWidth(), textView.getY());
    Point RB = rotatePoint(matrix, textView.getX() + textView.getMeasuredWidth(), textView.getY() + textView.getMeasuredHeight());
    Point LB = rotatePoint(matrix, textView.getX(), textView.getY() + textView.getMeasuredHeight());

    path.moveTo(LT.x, LT.y);
    path.lineTo(RT.x, RT.y);
    path.lineTo(RB.x, RB.y);
    path.lineTo(LB.x, LB.y);

    Region region = new Region();
    region.setPath(path,  new Region(0, 0, textViewParent.getWidth(), textViewParent.getHeight()));
    return region;
}

private Point rotatePoint(Matrix matrix, float x, float y){
    float[] pts = new float[2];
    pts[0] = x;
    pts[1] = y;
    matrix.mapPoints(pts);
    return new Point((int)pts[0], (int)pts[1]);
}
当我有两个区域与两个文本视图具有相同的位置和旋转时,我可以使用以下代码检查碰撞:

if (!region1.quickReject(region2) && region1.op(region2, Region.Op.INTERSECT)) {
    return true; //There is a collision
}

可能不是最好的解决方案,但它完成了工作。

我最终得到了以下解决方案,我创建了4个点,每个点对应于textView的每个角,然后以与textView相同的角度旋转。利用这些点,我创建了一条路径,我用它来创建一个区域

private Region createRotatedRegion(TextView textView){
    Matrix matrix = new Matrix();
    matrix.setRotate(textView.getRotation(), textView.getX() + textView.getMeasuredWidth() / 2, textView.getY() + textView.getMeasuredHeight() / 2);

    Path path = new Path();
    Point LT = rotatePoint(matrix, textView.getX(), textView.getY());
    Point RT = rotatePoint(matrix, textView.getX() + textView.getMeasuredWidth(), textView.getY());
    Point RB = rotatePoint(matrix, textView.getX() + textView.getMeasuredWidth(), textView.getY() + textView.getMeasuredHeight());
    Point LB = rotatePoint(matrix, textView.getX(), textView.getY() + textView.getMeasuredHeight());

    path.moveTo(LT.x, LT.y);
    path.lineTo(RT.x, RT.y);
    path.lineTo(RB.x, RB.y);
    path.lineTo(LB.x, LB.y);

    Region region = new Region();
    region.setPath(path,  new Region(0, 0, textViewParent.getWidth(), textViewParent.getHeight()));
    return region;
}

private Point rotatePoint(Matrix matrix, float x, float y){
    float[] pts = new float[2];
    pts[0] = x;
    pts[1] = y;
    matrix.mapPoints(pts);
    return new Point((int)pts[0], (int)pts[1]);
}
当我有两个区域与两个文本视图具有相同的位置和旋转时,我可以使用以下代码检查碰撞:

if (!region1.quickReject(region2) && region1.op(region2, Region.Op.INTERSECT)) {
    return true; //There is a collision
}

可能不是最好的解决方案,但它完成了任务。

如何旋转这些视图?你能给我们看一下代码吗?我不知道你是如何旋转
视图的,但是如果你之前知道它们的坐标,知道角度,你可以用一些三角法计算边界框。下面是一篇关于这方面的优秀文章:要旋转textview,我使用的是setRotation函数。如何旋转这些视图?你能给我们看一下代码吗?我不知道你是如何旋转
视图的,但是如果你之前知道它们的坐标,知道角度,你可以用一些三角法计算边界框。下面是一篇关于这方面的优秀文章:要旋转textview,我使用的是setRotation函数。Se编辑