android studio: проверка столкновений ImageView всегда возвращает мне истинное значение, всегда поверх других приложений-приложений, которые я делаю - PullRequest
0 голосов
/ 02 апреля 2020

Как кратко указано в topi c, я пытаюсь обнаружить столкновения двух изображений, которые я показываю в приложении, которое отображается поверх всего, как сервис плавающих виджетов.

Мой первый просмотр изображений 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;
                }
            }
        });

Так же, как это я сделал еще один просмотр изображений q. Таким образом, я могу свободно перетаскивать эти два изображения.

Затем, пытаясь обнаружить столкновения с этими двумя изображениями, я попробовал 3 способа, которые я нашел здесь на stackoverflow.

Например:

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

Независимо от того, что я пробую, они всегда дают мне «истину» в начале приложения, во время перетаскивания или после перетаскивания, когда Я могу безошибочно определять координаты каждого изображения.

Если кто-нибудь может помочь мне исправить, вероятно, глупую ошибку, которую я допустил, это было бы очень признательно>. <</p>

Заранее спасибо!

1 Ответ

0 голосов
/ 03 апреля 2020

Я сделал это еще одним способом проверки столкновения со следующим

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

Хотя теперь он «правильно» обнаруживает столкновения (в кавычках из-за false true в зависимости от форм), каждый вызов очень длинный .. И поэтому я чувствую, что, может быть, умнее, чем я не знаю ...

...