如何知道一个移动视图(重叠)何时位于顶部

时间:2016-04-21 20:37:36

标签: android

(不确定标题。请正确使用)

您好。我正在尝试创建一个小游戏,玩家可以在RalativeLayout内移动对象。我想要的是检查我的移动物体是在FrameLayout内还是在它之外。例如,我想在FrameLayout内部更改此对象的文本。

所以我以这种方式在for循环内创建对象:

Random random = new Random();
for (int i = 0; i < 3; i++) {  //any number, not just 3
            TextView textView = new TextView(getActivity());
            textView.setX(random.nextInt(size.x - 200));
            textView.setY(random.nextInt(size.y - 200)); //scattered all over the screen
            textView.setText(i + "");
            textView.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
            textView.setTextSize(50);
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            textView.setLayoutParams(lp);
            textView.setOnTouchListener(touchListener);
            frameFor.addView(textView);
        }

还有一个FrameLayout,最终我的所有对象应该是:

RelativeLayout.LayoutParams frameLP = new RelativeLayout.LayoutParams(300, 300);
        frameLP.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        frameForLetters.setLayoutParams(frameLP);

如您所见,我还添加了OnTouchListener以使对象可以移动:

View.OnTouchListener touchListener = new View.OnTouchListener() {
        float dX, dY;

        @Override
        public boolean onTouch(View view, MotionEvent event) {
            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:

                    dX = view.getX() - event.getRawX();
                    dY = view.getY() - event.getRawY();
                    break;

                case MotionEvent.ACTION_MOVE:

                    view.animate()
                            .x(event.getRawX() + dX)
                            .y(event.getRawY() + dY)
                            .setDuration(0)
                            .start();
                    break;
                default:
                    return false;
            }
            return true;
        }
    };

在这张照片中,你可以看到一个两个FrameLayout内,零在外面。 enter image description here

我知道这一切都可以用大量的几何体来完成,并计算每个对象和FrameLayout本身的大小。也许有另一种方法可以做到这一点?也许有一个库或框架可以让我的任务更容易?

1 个答案:

答案 0 :(得分:1)

我不知道库或框架,但您可以使用这两种方法来确定对象是否重叠(Rect.intersects方法执行大部分计算):

private Rect getScreenBounds(View view)
{
    int[] location = new int[2];
    view.getLocationOnScreen(location);

    return new Rect(location[0], location[1], location[0] + view.getWidth(), location[1] + view.getHeight());
}

private boolean doViewsIntersect(View target, View item)
{
    Rect targetRect = getScreenBounds(target);
    Rect itemRect = getScreenBounds(item);

    return targetRect.intersects(itemRect);
}

如果您想知道对象是否完全在另一个内,targetRect将成为包含交集的Rect。因此,您可以执行以下操作以查看该项是否完全位于目标边界内:

if(targetRect.intersects(itemRect)) {
    return targetRect.width() == item.getWidth() && targetRect.height() == item.getHeight();
} else {
    return false;
}