如前所述,您应该使用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;
}