2017-02-16 3 views
-1

Я пытаюсь создать динамические кнопки в центре сфер применения ImageView. Для того, чтобы выяснить, центр любой области, я использую эту функцию:Android-вид высоты меняется во время работы

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; 
    } 

Когда начинается деятельность, эта функция вызывается в течение цикла (количество петли зависит от количества зон) для создания кнопок на ImageView , Когда все кнопки создаются, пользователь может щелкнуть по одной из динамических кнопок, чтобы сосредоточиться на spesific area.

Если пользователь нажимает на любую кнопку, функция createButton() вызывается снова (она не нужна, но она также не делает проблему) для некоторых целей.

Проблема: высота изображения не фиксирована. При первом вызове функции createButton() высота возвращает больше, чем нормальная высота. Затем, если вы снова вызываете createButton(), высота возвращает нормальное значение.

imageViewHeight = imageView.getHeight();

imageViewWidth = imageView.getWidth();

Класс имеет 2-3 вложенных потока, поэтому, возможно, это является причиной проблемы. Но я пробовал много вещей, как:

  1. я использовал CountDownLatch для обработки потоков и функции
  2. Я mImageView.post (новый Runnable ...), чтобы быть уверенным, чтобы вызывать функции после ImageView создается.
  3. Я назвал imageView.getHeight() много разных мест, но ничего не изменилось.

Я сохраняю выражение долго, потому что я не мог решить, достаточно ли информации, чтобы понять. И, как вы понимаете, английский не мой родной. Спасибо.

Редактировать: Я забыл упомянуть: ниже API 19 все круто (значение getHeight() возвращается как обычный размер, либо в первый раз при вызове метода createButton(), либо позже). API 20 и выше, я получаю эту ошибку.

+0

Попробуйте addOnGlobalLayoutListener() слушатели, такие как [this] (http://stackoverflow.com/a/8171014/4101990) –

+0

@MaheshB Я пробовал, но не работает. Такая же проблема возникает. – ACAkgul

+0

Почему он занижен? – ACAkgul

ответ

0

Я, к счастью, нашел решение. Я использую полноэкранный режим в своем приложении, но я не использовал AreaSelectActivity в полноэкранном режиме. После того, как активность открыта, строка состояния спускается через некоторое время. Вот почему высота меняется, но нет. Я поставил AreaSelectActivity в полноэкранном режиме и задницу! теперь он исправлен.

Смежные вопросы