Не удается обнаружить наложение двух представлений

avatar
djnotes
8 апреля 2018 в 04:16
41
2
1

Я написал небольшое приложение для 2D-анимации, в котором пользователь перемещается по ImageView в макете с направлениями DPAD. Существует еще один ImageView, который служит целью. Если мяч попадает в ворота, должно появиться сообщение об успехе. Приведенный ниже код неверен в том смысле, что при перемещении DPAD отображается сообщение об успехе!

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    ObjectAnimator animator;
    switch(keyCode) {
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            animator = ObjectAnimator.ofFloat(ball, "translationX", ball.getX() + STEP_X);
                    animator.start();
            break;
        case KeyEvent.KEYCODE_DPAD_LEFT:
            animator = ObjectAnimator.ofFloat(ball, "translationX", ball.getX() - STEP_X);
            animator.start();
            break;
        case KeyEvent.KEYCODE_DPAD_UP:
            animator = ObjectAnimator.ofFloat(ball, "translationY", ball.getY() - STEP_Y);
            animator.start();
            break;
        case KeyEvent.KEYCODE_DPAD_DOWN:
            animator = ObjectAnimator.ofFloat(ball, "translationY",   ball.getY() + STEP_Y);
        animator.start();
        break;
    }
    Rect ballRect = new Rect(ball.getLeft(), ball.getTop(), ball.getRight(), ball.getBottom());
    Rect goalRect = new Rect(goal.getLeft(), goal.getTop(), goal.getRight(), ball.getBottom());

    if(goalRect.intersect(ballRect)) {
        Toast.makeText(MainActivity.this, "Goal", Toast.LENGTH_SHORT).show();
    }

    return super.onKeyDown(keyCode, event);
}

Макет:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <ImageView
        android:id="@+id/goal"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:scaleType="centerCrop"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@drawable/field" />
    <ImageView
        android:id="@+id/object"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:contentDescription="Object"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ball" />

</android.support.constraint.ConstraintLayout>

Предварительный просмотр:

enter image description here

Есть идеи?

Источник
Ramana V V K
8 апреля 2018 в 05:05
0

можете ли вы рассказать больше о представлениях изображений, которые вы используете

djnotes
8 апреля 2018 в 05:41
0

Конечно @ramanavv! добавлен

Cvarier
8 апреля 2018 в 19:19
0

@JasonStack, у тебя была возможность посмотреть, помог ли мой ответ?

Ответы (2)

avatar
Ramana V V K
8 апреля 2018 в 06:22
1

Следующий код будет работать для вас:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    ObjectAnimator animator;
    switch(keyCode) {
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            animator = ObjectAnimator.ofFloat(ball, "translationX", ball.getX() + STEP_X);
                    animator.start();
            break;
        case KeyEvent.KEYCODE_DPAD_LEFT:
            animator = ObjectAnimator.ofFloat(ball, "translationX", ball.getX() - STEP_X);
            animator.start();
            break;
        case KeyEvent.KEYCODE_DPAD_UP:
            animator = ObjectAnimator.ofFloat(ball, "translationY", ball.getY() - STEP_Y);
            animator.start();
            break;
        case KeyEvent.KEYCODE_DPAD_DOWN:
            animator = ObjectAnimator.ofFloat(ball, "translationY",   ball.getY() + STEP_Y);
        animator.start();
        break;
    }
    Rect ballRect = new Rect(ball.getLeft(), ball.getTop(), ball.getRight(), ball.getBottom());
    Rect goalRect = new Rect(goal.getLeft(), goal.getTop(), goal.getRight(), goal.getBottom());

    if(goalRect.intersect(ballRect)) {
        Toast.makeText(MainActivity.this, "Goal Success", Toast.LENGTH_SHORT).show();
    }

    return super.onKeyDown(keyCode, event);
}

Успех цели Toast будет отображаться при пересечении

djnotes
8 апреля 2018 в 07:57
0

Я не уверен, что это чем-то отличается от кода в вопросе

Ramana V V K
8 апреля 2018 в 08:05
0

в основном похоже на то, что вы только что дали ball.getBottom() в targetRect в вопросе

avatar
Cvarier
8 апреля 2018 в 06:00
0

Вы неправильно установили размеры для goalRect, измените

Rect goalRect = new Rect(goal.getLeft(), goal.getTop(), goal.getRight(), ball.getBottom());

до

Rect goalRect = new Rect(goal.getLeft(), goal.getTop(), goal.getRight(), goal.getBottom());

Кроме того, это не влияет на ваш код, но если вы используете intersect(), то goalRect() будет установлено на ballRect(), если два Rect пересекаются. В будущем, если вы не хотите случайно изменить свои прямоугольники, используйте intersects(). См. https://developer.android.com/reference/android/graphics/Rect.html#intersect(int,%20int,%20int,%20int) для получения дополнительной информации.