android - android studio:ImageView 碰撞检查总是返回一个真实值,在我正在制作的其他应用服务应用程序之上
问题描述
正如主题中简要说明的那样,我正在尝试检测我在一个显示在所有内容之上的应用程序中显示的 2 个图像视图的冲突,作为浮动小部件服务。
我的第一个 imageview 是 p:
p = new ImageView(this);
p.setImageResource(R.drawable.k);
pp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
pp.gravity = Gravity.TOP | Gravity.LEFT;
pp.x = 100; pp.y = 100;
window.addView(p,pp);
// ============= makes it a button for dragging and stuff //
p.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View arg0, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
//detect tap
return true;
} else {
// detects move and drag
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = pp.x;
initialY = pp.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
pp.x = initialX + (int) (event.getRawX() - initialTouchX);
pp.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(p, pp);
return true;
}
return false;
}
}
});
所以与此类似,我制作了另一个 imageview q。所以我可以自由地拖动这两个图像视图。
然后尝试检测与这两个图像视图的冲突,我尝试了在 stackoverflow 上找到的 3 种方法。
像这些:
public boolean CheckCollision(View v1,View v2) {
Rect R1=new Rect(v1.getLeft(), v1.getTop(), v1.getRight(), v1.getBottom());
Rect R2=new Rect(v2.getLeft(), v2.getTop(), v2.getRight(), v2.getBottom());
return R1.intersect(R2);
}
public boolean chk(ImageView v1,ImageView v2) {
Rect R1=new Rect();
v1.getDrawingRect(R1);
Rect R2=new Rect();
v2.getDrawingRect(R2);
return Rect.intersects(R1,R2);
}
public boolean chkm(ImageView v1,ImageView v2) {
Rect R1=new Rect();
v1.getHitRect(R1);
Rect R2=new Rect();
v2.getHitRect(R2);
return R1.intersect(R2);
}
无论我尝试哪一个,它们总是在应用程序开始时、拖动期间或拖动后给我“真实”,而我可以毫无问题地正确检测每个图像视图的坐标。
如果有人可以帮助我纠正我犯的一个可能愚蠢的错误,将不胜感激>.<
提前致谢!
解决方案
我用另一种方法检查与以下的碰撞
public boolean collide(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2){
boolean col = false;
if ( (x1+w1) >= x2 &&
(x1) <= (x2 + w2) &&
(y1+h1) >= y2 &&
(y1) <= (y2 + h2)
){
col = true;
}
return col;
//successful detection but every call is long, example in my app like ...
//collide(pp.x, pp.y, p.getWidth(), p.getHeight(), qp.x, qp.y, q.getWidth(), q.getHeight()));
}
虽然现在它“正确”检测到碰撞(引用,因为根据形状判断为真),但每次调用都很长......因此我觉得可能有一种我不知道的更聪明的方式......
推荐阅读
- javascript - 在 Nav 中选择一个 Div
- c# - 有没有比 .Any() 更快的方法来查找 IEnumerable
有数据吗? - azure - 有关 Azure AD + Intune 许可的问题?
- spring-boot - Spring-boot,JPA如何保存对象的集合
- python - 如何将 ASCII 323534 转换为十进制 254
- javascript - 在 var siteurl 上将 HTTP 替换为 HTTPS 以消除 xmlhttprequest 错误
- mobile-safari - 未检测到 Aframe 移动设备运动
- laravel - Laravel 导出到 csv 超时
- ios - 在我构建的第一个函数中出现“无法识别的选择器错误”
- hyperledger-fabric - 如何使用fabric sdk(fabric-client)安装链码?