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 个嵌套线程,所以这可能是问题的原因。但我尝试了很多事情,比如:

  1. 我使用 CountDownLatch 来处理线程和函数
  2. 我使用 mImageView.post(new Runnable...) 确保在创建 imageView 后调用函数。
  3. 我给 imageView.getHeight() 打了很多电话 不同的地方,但没有任何改变。

我把表达保持得很长,因为我不确定信息是否足以理解。正如你所知,英语不是我的母语。谢谢。

编辑:我忘了提及:在 API19 以下,一切都很酷(getHeight() 值以正常大小返回,无论是在第一次调用 createButton() 方法时还是稍后)。 API 20 及以上,出现此错误。

我幸运地找到了解决方案。我在我的应用程序中使用全屏模式,但我没有在全屏模式下使用 AreaSelectActivity。 activity 打开后,状态栏一会儿就下来了。这就是为什么高度改变但长度不变的原因。我将 AreaSelectActivity 置于全屏模式并运行!现在已经修复了。