Android getLocationInWindow和getLocationOnScreen的区别
用法
两者都表示可以用来获取一个控件的位置,那么两者有什么样的区别呢?
在对于一般的场景,即普通的Activity来说,两者并没有什么区别
如标题所言,在这种场景下,两者获取的值是相同的,值得注意的是,这里获取到的坐标,是包含了状态栏的坐标。
对于Dialog或者其他自定义的window窗口,两者不同
其实顾名思义,getLocationInWindow是获取的在window窗口内的坐标,dialog是新创建了一个window,所以之类获得的坐标是在该window窗口内的坐标;而getLocationOnScreen是获得在整个屏幕区域上的坐标。
当然,除了dialog以外,floatwindow也是一样的。
不信?那就看下面的例子。
我们如下定义一个布局
binding.button.setOnClickListener(v -> {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setMessage("message")
.setTitle("title")
.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("submit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int[] location = new int[2];
v.getLocationInWindow(location);
log(Arrays.toString(location));
int[] newloc = new int[2];
v.getLocationOnScreen(newloc);
log(Arrays.toString(newloc));
}
});
});
在上述代码中,我们定义了一个dialog,并获取他的positive的getLocationInWindow和getLocationOnScreen坐标
结果如下:
11-11 21:36:46.917 17169 17169 E MainActivity: yanlog msg:[717, 363]
11-11 21:36:46.917 17169 17169 E MainActivity: yanlog msg:[744, 1069]