我正在开发一个信息亭应用程序,我试图创建一种行为,当用户单击屏幕的所有 4 个角时,我运行代码以退出信息亭模式。我完成了大部分代码的设置和工作,但遇到了两个条件未被调用的问题。调试后,我注意到 MouseEvent 返回的 y 值大于屏幕高度,但我无法确定原因。单击屏幕的右上角和左上角效果良好,但底部是出现问题的地方。我有什么遗漏的吗?
我尝试使用 this 示例来查找边界,但有点困惑,因为 maxY 似乎位于屏幕底部。 maxY 验证似乎失败了,因为即使屏幕 maxY 为 736,我触摸时显示的 y 值也高于该值。有人可以告诉我我错过了什么或做错了什么吗?
我的布局边界设置为匹配宽度和匹配高度。
@NotNull
private View.OnTouchListener setupMotionListener() {
return new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
int count = arg1.getPointerCount();
if(count == 4) {
for (int i = 0; i < count; i++) {
x[i] = arg1.getX(i);
y[i] = arg1.getY(i);
}
Display mdisp = getWindowManager().getDefaultDisplay();
Point mdispSize = new Point();
mdisp.getSize(mdispSize);
int maxX = mdispSize.x;
int maxY = mdispSize.y;
for (int i = 0; i < count; i++) {
if (x[i] >= 0 && x[i] <= 100 && y[i] >= 0 && y[i] <= 100) {
closeClicked.set(0, true);
} else if (x[i] >= 0 && x[i] <= 100 && y[i] <= maxY && y[i] >= (maxY - 100)) {
closeClicked.set(1, true);
} else if (x[i] <= maxX && x[i] >= (maxX - 100) && y[i] >= 0 && y[i] <= 100) {
closeClicked.set(2, true);
} else if (x[i] <= maxX && x[i] >= (maxX - 100) && y[i] <= maxY && y[i] >= (maxY - 100)) {
closeClicked.set(3, true);
}
}
if (!closeClicked.contains(false)) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("isKioskEnabled", false);
editor.commit();
Intent kiosk = new Intent(KioskActivity.this, MainActivity.class);
kiosk.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(kiosk);
} else {
closeClicked = Arrays.asList(false, false, false, false);
x = new float[4];
y = new float[4];
}
} else {
x = new float[4];
y = new float[4];
}
return true;
}
};
}
我的 maxX 或 screenWidth 是:1280 我的 maxY 或 screenHeight 是:736
请注意,
mdispSize.y
不返回屏幕高度,而是返回可用屏幕高度,即ScreenHeight - 导航栏的高度。因此,如果您单击屏幕的两个最低角(即导航栏上),那么确实 arg1.getX(...) > mdispSize.y。
使用
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
maxY = displayMetrics.heightPixels;
相反。