Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建随机放置的按钮,但不超过屏幕大小_Java_Android_Button_Random - Fatal编程技术网

Java 创建随机放置的按钮,但不超过屏幕大小

Java 创建随机放置的按钮,但不超过屏幕大小,java,android,button,random,Java,Android,Button,Random,我正在尝试创建一个包含10个按钮的活动,这些按钮是通过编程生成的,位于屏幕上的随机位置,但不会超过屏幕大小 我试着这么做,但大多数按钮超出了屏幕大小(我看不见) LinearLayout LinearLayout=(LinearLayout)findViewById(R.id.linear); 随机rnd=新随机(); DisplayMetrics DisplayMetrics=新的DisplayMetrics(); getWindowManager().getDefaultDisplay().

我正在尝试创建一个包含10个按钮的活动,这些按钮是通过编程生成的,位于屏幕上的随机位置,但不会超过屏幕大小

我试着这么做,但大多数按钮超出了屏幕大小(我看不见)

LinearLayout LinearLayout=(LinearLayout)findViewById(R.id.linear);
随机rnd=新随机();
DisplayMetrics DisplayMetrics=新的DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height=displaymetrics.heightPixels;
int width=displaymetrics.widthPixels;

对于(int x=0;x您需要使用RelativeLayout而不是LinearLayout来放置具有绝对值的按钮


编辑:我刚找了一个参考,你可以找到它。

你应该像前面所说的那样使用
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);
    }
接下来,为了解决重叠问题,我编写了以下示例

// 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;
}
//创建用于保存坐标的虚拟类
公共类按钮协调{
公共int x;
公共智力;
公共按钮坐标(整数x,整数y){
这个.x=x;
这个。y=y;
}
}
//在MainActivity类中,创建用于保存坐标的数组
按钮坐标[]按钮坐标=新按钮坐标[10];
int x=0;
而(x<10){
int Xposition=rnd.nextInt(宽度-按钮宽度);
int Yposition=rnd.nextInt(高度-按钮高度);
buttonCoords buttonCoords=新的buttonCoords(Xposition,Yposition);
如果(!Coordinates Free(buttonCoords、ButtonCheight、ButtonCheidth)){
//再找一次机会
继续;
}
按钮btn=新按钮(此按钮);
btn.setX(Xposition);
btn.setY(位置);
btn.设置宽度(按钮宽度);
btn.设置高度(按钮高度);
btn.setText(Xposition+“;”+Yposition);
ButtonsCoordinates数组[x++]=ButtonCoods;
线性布局。添加视图(btn);
Log.d(“调试”、“Xpos=“+Xposition”);
Log.d(“调试”、“Ypos=“+Yposition”);
}
//防止重叠的方法
私有布尔坐标自由(ButtonCoordinations newButton、int buttonHeight、int buttonWidth){
用于(按钮坐标现有按钮:按钮坐标阵列){
如果(existingButton==null){
//有史以来的第一个按钮
返回true;
}
布尔f1=现有按钮.x+按钮宽度=新按钮.y;
如果(!f1&&!f2&&!f3&&!f4){
返回false;
}
}
返回true;
}

为什么要将100添加到随机值中?这将使按钮的左/顶部位置介于100和displayWidth之间,以及100和displayHeight之间。放置在那里的按钮将从屏幕右/底部消失。@Ridcully我刚刚玩过它,我尝试了很多选项,似乎没有任何效果谢谢!我将计算重叠的部分现在出去!你太棒了:)@user2561521 max\u y\u val变量已更新。我在她身上使用了
width
。请在你的更新aswell@user2561521检查我的上一次编辑。对你来说,最终解决它是很重要的,它不应该占用你太多的时间time@user2561521这很有趣!我相信这是关于按钮的样式。给我看一张发生在哪里的照片,以及它们之间距离的记录。我假设按钮的宽度和高度仍然分别是150和40。谢谢!我会注意的!
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;
}