(不确定标题。请正确使用)
您好。我正在尝试创建一个小游戏,玩家可以在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
内,零在外面。
我知道这一切都可以用大量的几何体来完成,并计算每个对象和FrameLayout本身的大小。也许有另一种方法可以做到这一点?也许有一个库或框架可以让我的任务更容易?
答案 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;
}