使用 java 通过拖动在 android studio 中匹配 ImageView

Matching ImageViews in android studios by dragging, using java

提问人:Sbu 提问时间:11/4/2023 更新时间:11/4/2023 访问量:14

问:

通过将图像放在一排框的顶部来猜测它们下面的图像来创建一个猜谜游戏。当所有正确时,它应该被选为匹配项。但游戏有时会选择错误的匹配。当我放弃公差时,它不会拾取任何公差。我认为这是我的匹配方法,但不知道该怎么做了。

公共类 StageOne 扩展 AppCompatActivity {

List<ImageView> imageViews = new ArrayList<>();
List<ImageView> targetViews = new ArrayList<>();
float[] xDown;
float[] yDown;
float screenWidth;
float screenHeight;
/*float tolerance = 18; // Define your tolerance for successful match*/
ImageView winMessageImageView;
private Button button;
private Button button2;
private Button button3;
private int clickCount = 0;
private int clickCount2 = 0;
ImageView boxImageView1;
ImageView boxImageView2;
ImageView boxImageView3;
ImageView lifeImageView1;
ImageView lifeImageView2;
ImageView lifeImageView3;
ImageView gameOverImageView;
ImageView fireworkImageView;
ImageView fireworkImageView2;
ImageView fireworkImageView3;
ImageView fireworkImageView4;

public void launchStageTwo(View v) {
    Intent i = new Intent(this, StageTwo.class);
    startActivity(i);
}


@SuppressLint({"ClickableViewAccessibility", "MissingInflatedId"})
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_stage_one);

    winMessageImageView = findViewById(R.id.youWon);
    button = findViewById(R.id.help);
    button2 = findViewById(R.id.check);
    button3 = findViewById(R.id.nextstage);
    boxImageView1 = findViewById(R.id.box1);
    boxImageView2 = findViewById(R.id.box2);
    boxImageView3 = findViewById(R.id.box3);
    lifeImageView1 = findViewById(R.id.lifebarthree);
    lifeImageView2 = findViewById(R.id.lifebartwo);
    lifeImageView3 = findViewById(R.id.lifebarone);
    gameOverImageView = findViewById(R.id.gameover1);
    fireworkImageView = findViewById(R.id.firework);
    fireworkImageView2 = findViewById(R.id.firework2);
    fireworkImageView3 = findViewById(R.id.firework3);
    fireworkImageView4 = findViewById(R.id.firework4);

    Glide.with(this)
            .asGif()
            .load(R.drawable.fireworks2)
            .diskCacheStrategy(DiskCacheStrategy.NONE) // Disable disk caching for GIFs
            .into(fireworkImageView);

    Glide.with(this)
            .asGif()
            .load(R.drawable.fireworks2)
            .diskCacheStrategy(DiskCacheStrategy.NONE) // Disable disk caching for GIFs
            .into(fireworkImageView2);

    Glide.with(this)
            .asGif()
            .load(R.drawable.fireworks)
            .diskCacheStrategy(DiskCacheStrategy.NONE) // Disable disk caching for GIFs
            .into(fireworkImageView3);

    Glide.with(this)
            .asGif()
            .load(R.drawable.fireworks3)
            .diskCacheStrategy(DiskCacheStrategy.NONE) // Disable disk caching for GIFs
            .into(fireworkImageView4);


    imageViews.add(findViewById(R.id.star1));
    imageViews.add(findViewById(R.id.coin1));
    imageViews.add(findViewById(R.id.peach1));

    targetViews.add(findViewById(R.id.star));
    targetViews.add(findViewById(R.id.coin));
    targetViews.add(findViewById(R.id.peach));

    xDown = new float[imageViews.size()];
    yDown = new float[imageViews.size()];


    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    screenWidth = size.x;
    screenHeight = size.y;


    button.setOnClickListener(v -> {
        // Increment the click count
        clickCount++;

        if (clickCount == 1) {
            boxImageView1.setVisibility(View.GONE);
        }

        // Check if the click count is 2, and disable the button if it is
        if (clickCount == 2) {
            boxImageView2.setVisibility(View.GONE);
            button.setEnabled(false);
        }
    });

    button2.setOnClickListener(v -> {
        // Increment the click count
        clickCount2++;

        if (clickCount2 == 1 && allTargetsMatched()) {
            winMessageImageView.setVisibility(View.VISIBLE);
            boxImageView1.setVisibility(View.INVISIBLE);
            boxImageView2.setVisibility(View.INVISIBLE);
            boxImageView3.setVisibility(View.INVISIBLE);

            fireworkImageView.setVisibility(View.VISIBLE);
            fireworkImageView2.setVisibility(View.VISIBLE);
            fireworkImageView3.setVisibility(View.VISIBLE);
            fireworkImageView4.setVisibility(View.VISIBLE);

            button3.setVisibility(View.VISIBLE);
        } else if (clickCount2 == 1) {
            lifeImageView1.setVisibility(View.GONE);
        }
        if (clickCount2 == 2 && allTargetsMatched()) {
            winMessageImageView.setVisibility(View.VISIBLE);
            boxImageView1.setVisibility(View.INVISIBLE);
            boxImageView2.setVisibility(View.INVISIBLE);
            boxImageView3.setVisibility(View.INVISIBLE);

            fireworkImageView.setVisibility(View.VISIBLE);
            fireworkImageView2.setVisibility(View.VISIBLE);
            fireworkImageView3.setVisibility(View.VISIBLE);
            fireworkImageView4.setVisibility(View.VISIBLE);

            button3.setVisibility(View.VISIBLE);
        } else if (clickCount2 == 2) {
            lifeImageView2.setVisibility(View.GONE);
        }
        if (clickCount2 == 3 && allTargetsMatched()) {
            winMessageImageView.setVisibility(View.VISIBLE);
            boxImageView1.setVisibility(View.INVISIBLE);
            boxImageView2.setVisibility(View.INVISIBLE);
            boxImageView3.setVisibility(View.INVISIBLE);

            fireworkImageView.setVisibility(View.VISIBLE);
            fireworkImageView2.setVisibility(View.VISIBLE);
            fireworkImageView3.setVisibility(View.VISIBLE);
            fireworkImageView4.setVisibility(View.VISIBLE);

            button3.setVisibility(View.VISIBLE);
        } else if (clickCount2 == 3) {
            lifeImageView3.setVisibility(View.GONE);
            gameOverImageView.setVisibility(View.VISIBLE);
        }
    });

    for (int i = 0; i < imageViews.size(); i++) {
        final ImageView imageView = imageViews.get(i);
        final int finalI = i;

        imageView.setOnTouchListener((v, event) -> {
            switch (event.getAction()) {

                //touch
                case MotionEvent.ACTION_DOWN:
                    xDown[finalI] = event.getX();
                    yDown[finalI] = event.getY();
                    break;

                //move finger
                case MotionEvent.ACTION_MOVE:
                    float movedX = event.getX();
                    float movedY = event.getY();

                    // Calculate the movement
                    float distanceX = movedX - xDown[finalI];
                    float distanceY = movedY - yDown[finalI];

                    // Calculate the new X position
                    float newX = imageView.getX() + distanceX;
                    float newY = imageView.getY() + distanceY;

                    // Limit the movement to stay within the screen bounds
                    if (newX >= 0 && (newX + imageView.getWidth()) <= screenWidth) {
                        imageView.setX(newX);
                    }
                    if (newY >= 0 && (newY + imageView.getHeight()) <= screenHeight) {
                        imageView.setY(newY);
                    }

                    // Check if the imageView is near a target
                    for (int j = 0; j < targetViews.size(); j++) {
                        ImageView target = targetViews.get(j);
                        if (isMatch(imageView, target)) {
                            break; // Exit the loop if a match is found
                        }
                    }
                    break;

                // Release
                case MotionEvent.ACTION_UP:
                    break;
            }
            return true;
        });
    }
}

private boolean isMatch(ImageView imageView, ImageView target) {

    Rect imageViewRect = new Rect();
    imageView.getGlobalVisibleRect(imageViewRect);

    Rect targetRect = new Rect();
    target.getGlobalVisibleRect(targetRect);

    // Check if the bounding rectangles intersect within tolerance
    if (Rect.intersects(imageViewRect, targetRect)) {

        Rect intersection = new Rect();
        if (intersection.setIntersect(imageViewRect, targetRect)) {
            int intersectionArea = intersection.height();
            int imageViewArea = imageViewRect.height();

            return intersectionArea >= 0.8 * imageViewArea;
        }
    }

    return false;
}

private boolean allTargetsMatched() {
    for (ImageView target : targetViews) {
        boolean targetMatched = false;
        for (ImageView imageView : imageViews) {
            if (isMatch(imageView, target)) {
                targetMatched = true;
                break; // 
            }
        }
        if (!targetMatched) {
            return false; 
        }
    }
    return true;
}

}

我尝试改变公差,但根本没有上升。我将游戏逻辑从将图像放置在盒子正上方的框架中,到将图像放置在盒子的顶部,以直接放在被猜测的图像之上,但仍然在稍微不合适时,它不会拾取。我也想带回以前的布局。

Java Android-Studio Android-ImageView 碰撞 TouchImageView

评论


答: 暂无答案