Как получить ширину и высоту измененного размера пользовательского вида перед его отрисовкой
В моем пользовательском представлении.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;
}
});