Android 视图交集不起作用
Android intersection of views not working
我在 Android 中设置了两个非常简单的视图:
这是我的代码,看看它们是否重叠,但由于某种原因,代码总是 returns "IS NOT overlapping":
私有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);
}
您正在检查视图位置,然后再进行测量并绘制到屏幕上。呼叫firstView.getWidth
可能是0。你可以通过日志检查。
添加 TreeObserver
或类似内容:secondView.addOnLayoutChangeListener
。
顺便说一句,我没有检查你的相交算法是否正确,只是通知你你的错误。
您需要等待 Activity 自行布局。
您可以为此使用处理程序:
new Handler().post(new Runnable() {
@Override
public void run() {
containsView(secondView, firstView)
}
});
如果您将对 containsView 的调用放入(按钮或其他任何东西的)clicklistener 中,则不会出现该问题,因为届时布局将完成。
我在 Android 中设置了两个非常简单的视图:
这是我的代码,看看它们是否重叠,但由于某种原因,代码总是 returns "IS NOT overlapping":
私有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);
}
您正在检查视图位置,然后再进行测量并绘制到屏幕上。呼叫firstView.getWidth
可能是0。你可以通过日志检查。
添加 TreeObserver
或类似内容:secondView.addOnLayoutChangeListener
。
顺便说一句,我没有检查你的相交算法是否正确,只是通知你你的错误。
您需要等待 Activity 自行布局。 您可以为此使用处理程序:
new Handler().post(new Runnable() {
@Override
public void run() {
containsView(secondView, firstView)
}
});
如果您将对 containsView 的调用放入(按钮或其他任何东西的)clicklistener 中,则不会出现该问题,因为届时布局将完成。