【问题标题】:Android intersection of views not workingAndroid 视图交集不起作用
【发布时间】:2015-03-03 21:10:59
【问题描述】:

我在 Android 中设置了两个非常简单的视图:

这是我的代码,看看它们是否重叠,但由于某种原因,代码总是返回“不重叠”:

私有 FrameLayout firstView; 私有 FrameLayout secondView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    firstView = (FrameLayout)findViewById(R.id.numberOne);
    secondView = (FrameLayout)findViewById(R.id.numberTwo);

    if (containsView(secondView, firstView)) {
        Toast.makeText(this, "IS overlapping", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(this, "IS NOT overlapping", Toast.LENGTH_LONG).show();
    }
}


public boolean containsView(View firstView, View secondView){
    int[] pointA = new int[2];
    firstView.getLocationOnScreen(pointA);
    Rect rectA = new Rect(pointA[0], pointA[1], pointA[0] + firstView.getWidth(), pointA[1] + firstView.getHeight());

    int[] pointB = new int[2];
    secondView.getLocationOnScreen(pointB);
    Rect rectB = new Rect(pointB[0], pointB[1], pointB[0] + secondView.getWidth(), pointB[1] + secondView.getHeight());

    return Rect.intersects(rectA, rectB);
}

【问题讨论】:

    标签: android intersection android-framelayout rect


    【解决方案1】:

    您正在检查视图位置,然后再测量它们并将其绘制到屏幕上。 firstView.getWidth 的调用可能是 0。你可以通过记录来检查它。

    添加TreeObserver 或类似:secondView.addOnLayoutChangeListener

    顺便说一句,我没有检查您的相交算法是否正确,只是通知您您的错误。

    【讨论】:

    • 很高兴我能帮上忙 (-:
    【解决方案2】:

    您需要等待 Activity 自行布局。 您可以为此使用处理程序:

    new Handler().post(new Runnable() {
        @Override
        public void run() {
            containsView(secondView, firstView)     
        }
    });
    

    如果您将对 containsView 的调用放入(按钮或其他任何内容的)clicklistener 中,则不会出现此问题,因为届时布局将完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多