Android- 视图高度在 运行 时间内发生变化
Android- View height is changing during the running time
我正在尝试在 ImageView 的特定区域的中心创建动态按钮。为了找出任何区域的中心,我正在使用这个函数:
TextView createButton(int i, String[] boundingBoxArray) {
String[] coorArray = boundingBoxArray[i].split(",");
int[] coordinates = new int[4];
int x11 = Integer.parseInt(coorArray[0].replace(" ", ""));
int y11 = Integer.parseInt(coorArray[1].replace(" ", ""));
int x22 = Integer.parseInt(coorArray[2].replace(" ", ""));
int y22 = Integer.parseInt(coorArray[3].replace(" ", ""));
coordinates[0] = x11;
coordinates[1] = y11;
coordinates[2] = x22;
coordinates[3] = y22;
TextView buttonn = new TextView(context);
buttonn.setText(String.valueOf(i + 1));
buttonn.setTextSize(15);
buttonn.setId(i + 1);
buttonn.setBackgroundResource(R.drawable.circle);
RelativeLayout.LayoutParams rel_btn
= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
Rect bounds = imageView.getDrawable().getBounds();
int scaledHeight = bounds.height();
int scaledWidth = bounds.width();
double scale;
double differWidth = 0;
double differHeight = 0;
imageViewHeight = imageView.getHeight();
imageViewWidth = imageView.getWidth();
if (scaledHeight > scaledWidth) {
scale = ((double) imageViewHeight / (double) scaledHeight);
differWidth = (imageViewWidth - (scaledWidth * scale)) / 2;
} else {
scale = ((double) imageViewWidth / (double) scaledWidth);
differHeight = (imageViewHeight - (scaledHeight * scale)) / 2;
}
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int swidth = displaymetrics.widthPixels;
int buttonWidth = swidth / 30;
double a = ((double) (x11 + x22) / 2) * scale - buttonWidth + differWidth;
double b = ((double) (y11 + y22) / 2) * scale - buttonWidth + differHeight;
rel_btn.leftMargin = (int) a;
rel_btn.topMargin = (int) b;
rel_btn.width = 2 * buttonWidth;
rel_btn.height = 2 * buttonWidth;
buttonn.setGravity(Gravity.CENTER);
buttonn.setLayoutParams(rel_btn);
return buttonn;
}
当activity启动时,在for循环中调用此函数(循环次数取决于区域数)以在ImageView上创建按钮。创建所有按钮后,用户可以单击任何动态按钮之一以关注特定区域。
如果用户单击任何按钮,出于某些目的再次调用 createButton() 函数(这不是必需的,但也不会产生问题)。
问题是ImageView的高度不固定。第一次调用createButton()函数时,高度returns大于正常高度。然后,如果您再次调用 createButton(),高度 returns 正常值。
imageViewHeight = imageView.getHeight();
imageViewWidth = imageView.getWidth();
class 有 2-3 个嵌套线程,所以这可能是问题的原因。但我尝试了很多事情,比如:
- 我使用 CountDownLatch 来处理线程和函数
- 我使用 mImageView.post(new Runnable...) 确保在创建 imageView 后调用函数。
- 我给 imageView.getHeight() 打了很多电话
不同的地方,但没有任何改变。
我把表达保持得很长,因为我不确定信息是否足以理解。正如你所知,英语不是我的母语。谢谢。
编辑:我忘了提及:在 API19 以下,一切都很酷(getHeight() 值以正常大小返回,无论是在第一次调用 createButton() 方法时还是稍后)。 API 20 及以上,出现此错误。
我幸运地找到了解决方案。我在我的应用程序中使用全屏模式,但我没有在全屏模式下使用 AreaSelectActivity。 activity 打开后,状态栏一会儿就下来了。这就是为什么高度改变但长度不变的原因。我将 AreaSelectActivity 置于全屏模式并运行!现在已经修复了。
我正在尝试在 ImageView 的特定区域的中心创建动态按钮。为了找出任何区域的中心,我正在使用这个函数:
TextView createButton(int i, String[] boundingBoxArray) {
String[] coorArray = boundingBoxArray[i].split(",");
int[] coordinates = new int[4];
int x11 = Integer.parseInt(coorArray[0].replace(" ", ""));
int y11 = Integer.parseInt(coorArray[1].replace(" ", ""));
int x22 = Integer.parseInt(coorArray[2].replace(" ", ""));
int y22 = Integer.parseInt(coorArray[3].replace(" ", ""));
coordinates[0] = x11;
coordinates[1] = y11;
coordinates[2] = x22;
coordinates[3] = y22;
TextView buttonn = new TextView(context);
buttonn.setText(String.valueOf(i + 1));
buttonn.setTextSize(15);
buttonn.setId(i + 1);
buttonn.setBackgroundResource(R.drawable.circle);
RelativeLayout.LayoutParams rel_btn
= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
Rect bounds = imageView.getDrawable().getBounds();
int scaledHeight = bounds.height();
int scaledWidth = bounds.width();
double scale;
double differWidth = 0;
double differHeight = 0;
imageViewHeight = imageView.getHeight();
imageViewWidth = imageView.getWidth();
if (scaledHeight > scaledWidth) {
scale = ((double) imageViewHeight / (double) scaledHeight);
differWidth = (imageViewWidth - (scaledWidth * scale)) / 2;
} else {
scale = ((double) imageViewWidth / (double) scaledWidth);
differHeight = (imageViewHeight - (scaledHeight * scale)) / 2;
}
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int swidth = displaymetrics.widthPixels;
int buttonWidth = swidth / 30;
double a = ((double) (x11 + x22) / 2) * scale - buttonWidth + differWidth;
double b = ((double) (y11 + y22) / 2) * scale - buttonWidth + differHeight;
rel_btn.leftMargin = (int) a;
rel_btn.topMargin = (int) b;
rel_btn.width = 2 * buttonWidth;
rel_btn.height = 2 * buttonWidth;
buttonn.setGravity(Gravity.CENTER);
buttonn.setLayoutParams(rel_btn);
return buttonn;
}
当activity启动时,在for循环中调用此函数(循环次数取决于区域数)以在ImageView上创建按钮。创建所有按钮后,用户可以单击任何动态按钮之一以关注特定区域。
如果用户单击任何按钮,出于某些目的再次调用 createButton() 函数(这不是必需的,但也不会产生问题)。
问题是ImageView的高度不固定。第一次调用createButton()函数时,高度returns大于正常高度。然后,如果您再次调用 createButton(),高度 returns 正常值。
imageViewHeight = imageView.getHeight();
imageViewWidth = imageView.getWidth();
class 有 2-3 个嵌套线程,所以这可能是问题的原因。但我尝试了很多事情,比如:
- 我使用 CountDownLatch 来处理线程和函数
- 我使用 mImageView.post(new Runnable...) 确保在创建 imageView 后调用函数。
- 我给 imageView.getHeight() 打了很多电话 不同的地方,但没有任何改变。
我把表达保持得很长,因为我不确定信息是否足以理解。正如你所知,英语不是我的母语。谢谢。
编辑:我忘了提及:在 API19 以下,一切都很酷(getHeight() 值以正常大小返回,无论是在第一次调用 createButton() 方法时还是稍后)。 API 20 及以上,出现此错误。
我幸运地找到了解决方案。我在我的应用程序中使用全屏模式,但我没有在全屏模式下使用 AreaSelectActivity。 activity 打开后,状态栏一会儿就下来了。这就是为什么高度改变但长度不变的原因。我将 AreaSelectActivity 置于全屏模式并运行!现在已经修复了。