2016-04-21 33 views
0

(不知道标题请正确)如何知道何时一个移动视图(重叠)位于顶部

嗨。我正在尝试创建一个小游戏,玩家可以在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; 
     } 
    }; 

in t他的照片你可以看到一个两个都在FrameLayout里面,零在外面。 enter image description here

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

回答

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; 
} 
相关问题