开发者社区 问答 正文

如何通过单击图像按钮但图像按钮本身保持在其原始位置来随机放置按钮?

我在Android Studio中遇到问题。我想要的效果如下:

案例:单击图像按钮时,一些按钮会随机更改其位置和位置。所有按钮都位于风景屏幕的上半部分,并且允许它们仅在风景屏幕的上半部分而不是下半部分的屏幕上随机更改其位置。它们彼此不重叠。单击图像按钮后,所有按钮均会随机更改其位置,但图像按钮本身仍保持其原始位置。

希望你能帮助我。提前致谢!

主要活动代码:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_keyboard);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

Button buttons[] = new Button[5];
text = (TextView) findViewById(R.id.txt);
buttons[0] = (Button) findViewById(R.id.bt1);
buttons[0].setOnClickListener(this);
buttons[1] = (Button) findViewById(R.id.bt2);
buttons[1].setOnClickListener(this);
buttons[2] = (Button) findViewById(R.id.bt3);
buttons[2].setOnClickListener(this);
buttons[3] = (Button) findViewById(R.id.bt4);
buttons[3].setOnClickListener(this);
buttons[4] = (Button) findViewById(R.id.bt5);
buttons[4].setOnClickListener(this);
Imgbtn = (ImageButton) findViewById(R.id.Imgbtn);

}
@Override
public void onClick(View v) {
Random rand = new Random();
    View decorView = getWindow().getDecorView();
    int screenWidth = decorView.getWidth();
    int screenHeight = decorView.getHeight();
    v.setX(rand.nextInt(screenWidth - v.getWidth()));
    v.setY(rand.nextInt(screenHeight - v.getHeight()));}


Imgbtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(text.getText().toString().equals("COC")){
            LayoutInflater li = getLayoutInflater();
            View layout = li.inflate(R.layout.correct_toast, (ViewGroup) 
findViewById(R.id.correct_toast_layout_id));
            Toast toast = new Toast(getApplicationContext());
            toast.setView(layout);
            toast.setDuration(Toast.LENGTH_SHORT);
            toast.setView(layout);//setting the view of custom correct_toast layout
            toast.show();
            MediaPlayer ring= MediaPlayer.create(getApplicationContext(),R.raw.correct);
            ring.start();
        }else{
            LayoutInflater li = getLayoutInflater();
            View layout = li.inflate(R.layout.wrong_toast, (ViewGroup) findViewById(R.id.wrong_toast_layout_id));
            Toast toast = new Toast(getApplicationContext());
            toast.setView(layout);
            toast.setDuration(Toast.LENGTH_SHORT);
            toast.setView(layout);//setting the view of custom correct_toast layout
            toast.show();
            MediaPlayer ring= MediaPlayer.create(getApplicationContext(),R.raw.wrong);
            ring.start();
        }
    }
});

展开
收起
几许相思几点泪 2019-12-05 15:49:13 377 分享 版权
阿里云 AI 助理回答

要实现您所描述的功能,您需要对按钮的随机位置设置一些限制,确保它们只在屏幕的上半部分移动,并且不重叠。以下是一种可能的实现方式:

首先,定义一个方法来检查新位置是否在屏幕的上半部分并且与其他按钮不重叠。然后,在onClick事件中调用这个方法来更新按钮的位置。

  1. 创建一个方法来生成合法的新位置:
private boolean isValidNewPosition(View button, int newX, int newY) {
    // 确保Y坐标在上半部分
    int screenHeight = getWindow().getDecorView().getHeight();
    int halfScreenHeight = screenHeight / 2;
    if (newY >= halfScreenHeight) return false;

    // 检查新位置是否与其他按钮重叠
    for (Button b : buttons) {
        if (b != button && b.getX() == newX && b.getY() == newY) {
            return false;
        }
    }
    return true;
}
  1. 修改onClick方法以使用新位置验证:
@Override
public void onClick(View v) {
    Random rand = new Random();
    while (true) {
        int newPosX = rand.nextInt(getWindow().getDecorView().getWidth() - v.getWidth());
        int newPosY = rand.nextInt(getWindow().getDecorView().getHeight() / 2); // 只在上半部分
        if (isValidNewPosition(v, newPosX, newPosY)) {
            v.setX(newPosX);
            v.setY(newPosY);
            break; // 找到合适的位置后退出循环
        }
    }
}

// 对于ImageButton Imgbtn的点击事件,保持不变。

这段代码通过引入isValidNewPosition方法来确保每次按钮移动时都位于屏幕的上半部分,并且不会与任何其他按钮重叠。请注意,这种方法在按钮数量较多或屏幕空间有限的情况下可能会导致性能问题,因为它依赖于不断尝试直到找到一个有效位置。对于实际应用,可能需要更高效的算法来处理位置分配,比如预先计算可用区域并从这些区域内随机选择。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: