【问题标题】:creating buttons positioned randomly, without exceeding the screen size创建随机放置的按钮,不超过屏幕大小
【发布时间】:2018-06-10 11:14:51
【问题描述】:

我正在尝试创建一个包含 10 个按钮的 Activity,这些按钮以编程方式生成并位于屏幕上的随机位置,但不超过屏幕大小。

我尝试这样做,但大多数按钮超出了屏幕尺寸(我看不到它)。

    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear);
    Random rnd = new Random();

    DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int height = displaymetrics.heightPixels;
    int width = displaymetrics.widthPixels;

    for(int x = 0;x<10;x++) {

        Button btn = new Button(this);

        int Xpoistion = rnd.nextInt(width - 100) + 100;
        int Yposition = rnd.nextInt(height - 100) + 100;

        btn.setX(Xpoistion);
        btn.setY(Yposition);

        btn.setText(x +")"+width + "," + height + " | " + Xpoistion + "," + Yposition);

        linearLayout.addView(btn);

    }

所以我试图从高度和宽度创建“屏幕限制”,但由于某种原因我无法弄清楚。

我经常使用 Xposition 和 Yposition,但似乎没有什么对我有用。

非常感谢您的帮助。

【问题讨论】:

  • 为什么要在随机值上加 100?这将为您提供介于 100 和 displayWidth 之间的按钮的左/上位置。 100 和显示高度。放置在那里的按钮将离开屏幕向右/底部。
  • @Ridcully 我刚玩过它,我尝试了很多选项,似乎没有任何效果

标签: java android button random


【解决方案1】:

如前所述,您应该使用RelativeLayout。但是你的逻辑有点缺陷,你应该设置变量来保证你的按钮不会离开屏幕。我已经在你的代码中添加了一些代码

    int height = displaymetrics.heightPixels;
    int width = displaymetrics.widthPixels;
    int buttonWidth = 150;
    int buttonHeigh = 40;
    int max_x_val = width - buttonWidth;
    int max_y_val = heigth - buttonHeigh; // Edited here

    for(int x = 0;x<10;x++) {

        Button btn = new Button(this);

        int Xpoistion = rnd.nextInt(max_x_val - buttonWidth) + buttonWidth;
        int Yposition = rnd.nextInt(max_y_val - buttonHeigh) + buttonHeigh;

        btn.setX(Xpoistion);
        btn.setY(Yposition);
        btn.setWidth(buttonWidth);
        btn.setHeight(buttonHeigh);
        btn.setText(x +")"+width + "," + height + " | " + Xpoistion + "," + Yposition);

        relativeLayout.addView(btn);
        Log.d("Debug","Xpos =" + Xpoistion);
        Log.d("Debug","Ypos =" + Yposition);
    }

这仍然不是解决方案,因为按钮最终可能会重叠

上次编辑

仍有一些按钮被剪掉了。发生这种情况是因为我们拥有屏幕的整个尺寸,而我们需要的只是 Relative Layout 的尺寸 .. 顶部的蓝色条也被包括在内在不应该的情况下进行测量。但是这个错误修复起来有点棘手,但并非不可能,只要谷歌一下,你就会找到足够的帮助

编辑:我最初的想法是btn.setX()setY() 会将Button 集中在这些像素上,但它不会在这些像素中标记按钮的开始,所以我必须将随机化功能更改为:

int Xposition = rnd.nextInt(width - buttonWidth);
int Yposition = rnd.nextInt(height - buttonHeight);

接下来,为了解决重叠问题,我编写了以下示例

// Create dummy class for holding coordinates
public class ButtonCordinates{

 public int x;
 public int y;

 public ButtonCordinates(int x, int y) {
     this.x = x;
     this.y = y;
 }
}

//In MainActivity class create a array for holding coordinates
ButtonCoordinates [] buttonsCoordinates = new ButtonCoordinates [10];    

int x = 0;
while(x < 10) {

  int Xposition = rnd.nextInt(width - buttonWidth);
  int Yposition = rnd.nextInt(height - buttonHeight);

  ButtonCoordinates buttonCoords = new ButtonCoordinates (Xposition,Yposition);

  if(!coordinatesFree(buttonCoords,buttonHeight,buttonWidth)){
    // Get another chance
    continue;
  }

  Button btn = new Button(this);
  btn.setX(Xposition);
  btn.setY(Yposition);

  btn.setWidth(buttonWidth);
  btn.setHeight(buttonHeight);
  btn.setText(Xposition+";"+Yposition);

  buttonsCoordinatesArray[x++] = buttonCoords;

  linearLayout.addView(btn);
  Log.d("Debug","Xpos =" + Xposition);
  Log.d("Debug","Ypos =" + Yposition);
}

// Method that prevents overlapping
private boolean coordinatesFree(ButtonCoordinates newButton, int buttonHeight, int buttonWidth){

     for(ButtonCoordinates existingButton : buttonsCoordinatesArray){
        if(existingButton == null){
            // First button ever
            return true;
        }

        boolean f1 = existingButton.x + buttonWidth <= newButton.x;
        boolean f2 = existingButton.y + buttonHeight <= newButton.y;
        boolean f3 = existingButton.x - buttonWidth >= newButton.x;
        boolean f4 = existingButton.y - buttonHeight >= newButton.y;

        if(!f1 && !f2 && !f3 && !f4){
            return false;
        }

    }
    return true;
}

【讨论】:

  • 谢谢!我现在会弄清楚重叠的东西!你太棒了:)
  • @user2561521 max_y_val 变量已更新。我在她身上使用了width。也请更新你的
  • @user2561521 检查我上次的编辑。最终修复它对您来说很重要,并且不会花费您太多时间
  • @user2561521 很有趣!总帐
  • 我相信它与按钮的样式有关。给我看一张它发生的地方以及它们之间距离的日志。我假设按钮的宽度和高度仍然分别是 150 和 40。
【解决方案2】:

您需要使用 RelativeLayout 而不是 LinearLayout 来放置具有绝对值的按钮。

编辑:我只是找了一个参考,你可以找到它here

【讨论】:

  • 谢谢!我会看的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多