我正在尝试创建一个包含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玩了很多,但似乎没有什么对我有用。
非常感谢你的帮助。
答案 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