Как получить ширину и высоту измененного размера пользовательского вида перед его отрисовкой

В моем пользовательском представлении.xml я определил ширину и высоту как w = 600dp , h = 700dp, Теперь я знаю, что getMeasuredHeight() / getMeasuredWidth() дают значения ширины и высоты после прорисовки представления, и они могут отличаться от того, что я дал в XML-файле, есть ли обходной путь, чтобы получить getMeasuredHeight() а также getMeasuredWidth() значения перед просмотром фактически отображаются на макете, без использования onMeasure()?

И как рассчитать изменилось dp размеры на разных экранах? как мой 600h*700w при запуске на эмуляторе преобразуется в 300*300,

1 ответ

Вы можете переопределить onSizeChanged() чтобы получить высоту и ширину вида, когда он рисуется. Ссылка ниже:

  @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    mWidth = w;
    mHeight = h;
    super.onSizeChanged(w, h, oldw, oldh);
    Log.d(TAG, "onSizeChanged: " + " width: " + w + " height: " + h + " oldw " + oldw + " oldh " + oldh);
}

Для преобразования dp в пиксели вы можете использовать следующий код:

   sizeInPixels = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            sizeInDp, getResources().getDisplayMetrics());

У меня была такая же проблема.

Вот мое решение, как я столкнулся с подобной проблемой. Там вы можете получить ширину и высоту до того, как изображение будет нарисовано с помощьюOnPreDrawListener()

     ImageView iv= binding.photoRoundProfile;
     ViewTreeObserver vto = iv.getViewTreeObserver();
     vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
   
           private int mFinalWidth = 0;
           private int mFinalHeight = 0;
   
           public boolean onPreDraw() {
   
               if(mFinalHeight != 0 || mFinalWidth != 0)
                   return true;
   
               mFinalHeight = iv.getHeight();
               mFinalWidth = iv.getWidth();
               Log.d("hilength","Height: " + mFinalHeight + " Width: " + mFinalWidth);
   
               ImageUtil.setPic(binding.photoRoundProfile, mCurrentPhotoPath);
               return true;
           }
       });
Другие вопросы по тегам