创建随机定位的按钮,不超过屏幕尺寸

时间:2017-12-30 08:43:54

标签: java android button random

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

我试过这样做但是大部分按钮超出了屏幕尺寸(我看不到它)。

    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玩了很多,但似乎没有什么对我有用。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

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

编辑:我只是找了一个参考,你可以找到它Equals method for data class in kotlin

答案 1 :(得分:1)

您应该使用已经说过的 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); 置于这些像素的中心位置,但不会标记按钮的开头那些相同的像素,所以我不得不将randomize函数改为:

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

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

SQLitePCL