首页 > 解决方案 > 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);
}

无论我尝试哪一个,它们总是在应用程序开始时、拖动期间或拖动后给我“真实”,而我可以毫无问题地正确检测每个图像视图的坐标。

如果有人可以帮助我纠正我犯的一个可能愚蠢的错误,将不胜感激>.<

提前致谢!

标签: androidserviceimageviewcollision-detection

解决方案


我用另一种方法检查与以下的碰撞

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()));
}

虽然现在它“正确”检测到碰撞(引用,因为根据形状判断为真),但每次调用都很长......因此我觉得可能有一种我不知道的更聪明的方式......


推荐阅读