Java LayoutParams haven';当要求其宽度和高度时,未应用
我们正在开发android应用程序,但遇到了一个问题。Java LayoutParams haven';当要求其宽度和高度时,未应用,java,android,Java,Android,我们正在开发android应用程序,但遇到了一个问题。 我们使用矩形来计算(在本例中)点的点击框。但我们也希望根据屏幕大小设置这些点的大小。 因此,这可以在创建点时完成,但是,因为我们将点放置在以编程方式创建的(水平方向的)线性布局中,这些线性布局的大小在实际绘制之前无法获得。因此,我们在这里找到了解决方案,即在WindowFocusChanged上的覆盖方法中设置LayoutParams。这样就可以了,大小已经设置好了。但是,紧接着我们要计算矩形的大小,我们的点还没有画出来,所以矩形的大小是不
我们使用矩形来计算(在本例中)点的点击框。但我们也希望根据屏幕大小设置这些点的大小。
因此,这可以在创建点时完成,但是,因为我们将点放置在以编程方式创建的(水平方向的)线性布局中,这些线性布局的大小在实际绘制之前无法获得。因此,我们在这里找到了解决方案,即在WindowFocusChanged上的覆盖方法中设置LayoutParams。这样就可以了,大小已经设置好了。但是,紧接着我们要计算矩形的大小,我们的点还没有画出来,所以矩形的大小是不正确的。有办法解决这个问题吗?
我们的onWindowFocusChanged()当前是:
@Override
public void onWindowFocusChanged (boolean hasFocus){
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
//setting scaled layout for dots and lines and boxes
setParameters();
//making hitbox rectangles for dots
makeHitboxRectangles();
}
}
我们的setParameters()方法:
private void setParameters () {
LinearLayout ll = (LinearLayout) findViewById(R.id.linearLayout);
double llWidth = (double) ll.getWidth();
double margin = (0.03*llWidth);
double widthRatio1 = llWidth - (2 * margin);
double widthRatio2 = 3.*wp.getMatrix().getN()+1.;
double widthRatio = widthRatio1 / widthRatio2;
int dotSize = (int) widthRatio;
int lineWidth = 2 * dotSize;
int lineHeight = dotSize;
Log.i(TAG, "llWidth =" + llWidth + ", margin =" + margin + ", Dotsize =" + dotSize + "/" + widthRatio + ", part1 =" + widthRatio1 + ", part2 =" + widthRatio2);
LinearLayout.LayoutParams dotParams = new LinearLayout.LayoutParams(dotSize,dotSize);
LinearLayout.LayoutParams hLineParams = new LinearLayout.LayoutParams(lineWidth, lineHeight);
LinearLayout.LayoutParams vLineParams = new LinearLayout.LayoutParams(lineHeight, lineWidth);
LinearLayout.LayoutParams blockParams = new LinearLayout.LayoutParams(lineWidth, lineWidth);
for (int i=0; i<wp.getMatrix().getM()+1; i++) {
for (int j=0; j<wp.getMatrix().getN()+1; j++) {
dots[j][i].setLayoutParams(dotParams);
dots[j][i].setSize(dotSize);
dots[j][i].invalidate();
}
}
for (int i=0; i<lines.length; i++) {
if (lines[i].isHorizontal()) {
lines[i].setLayoutParams(hLineParams);
lines[i].invalidate();
lines[i].setWidth(lineWidth);
lines[i].setHeight(lineHeight);
} else {
lines[i].setLayoutParams(vLineParams);
lines[i].setWidth(lineHeight);
lines[i].setHeight(lineWidth);
}
}
for (int i=0; i<blocks.length; i++) {
blocks[i].setLayoutParams(blockParams);
blocks[i].setSize(lineWidth);
blocks[i].invalidate();
}
}
private void makeHitboxRectangles() {
for (int i=0; i<wp.getMatrix().getM()+1; i++) {
for (int j=0; j<wp.getMatrix().getN()+1; j++) {
int[] coords = new int[2];
((LinearLayout) dots[j][i].getParent()).getLocationOnScreen(coords);
Log.i(TAG, "for dot id=" + dots[j][i].getID() + ", layout coords =" + coords[0] + ", " + coords[1]);
rects[j][i] = new Rect(
dots[j][i].getLeft(),
dots[j][i].getTop() + coords[1],
dots[j][i].getRight(),
dots[j][i].getBottom() + coords[1]);
Log.i(TAG, "rect for id=" + dots[j][i].getID() + " is (" +
dots[j][i].getLeft() + ", " +
( dots[j][i].getTop() + coords[1] ) + ", " +
dots[j][i].getRight() + ", " +
( dots[j][i].getBottom() + coords[1] ) + ")");
}
}
}
private void setParameters(){
LinearLayout ll=(LinearLayout)findViewById(R.id.LinearLayout);
double llWidth=(double)ll.getWidth();
双边距=(0.03*llWidth);
双宽度比1=llWidth-(2*边距);
双宽度比2=3。*wp.getMatrix().getN()+1。;
双宽度比=宽度比1/宽度比2;
int dotSize=(int)宽度比;
int lineWidth=2*dotSize;
int lineHeight=dotSize;
Log.i(标记,“llWidth=“+llWidth+”,margin=“+margin+”,Dotsize=“+Dotsize+”/“+widthRatio+”,part1=“+widthRatio1+”,part2=“+widthRatio2”);
LinearLayout.LayoutParams dotParams=新的LinearLayout.LayoutParams(dotSize,dotSize);
LinearLayout.LayoutParams hLineParams=新的LinearLayout.LayoutParams(线宽、线宽);
LinearLayout.LayoutParams vLineParams=新的LinearLayout.LayoutParams(线宽、线宽);
LinearLayout.LayoutParams blockParams=新的LinearLayout.LayoutParams(线宽、线宽);
对于(int i=0;iQuestion不清楚,您想知道显示宽度还是布局宽度?@Krish这不是一个真正的问题,更不是我们遇到的问题,当我们调用makeHitbox矩形()时,setParameters()的更改还没有应用日志打印是否正确?@Krish日志打印的第一条水平线是整个屏幕的大小,其他所有的都是0。你能发布日志吗?