Reputation: 2040
I've got an imageview, like this:
<ImageView
android:id="@+id/add_image_signup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/other_text"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
app:srcCompat="@drawable/add_button" />
which I'm trying to scale programmatically (based on device size) with Layout Params. Something like this works great:
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
val height = displayMetrics.heightPixels
val width = displayMetrics.widthPixels
val addImage = findViewById<ImageView>(R.id.add_image_signup)
val layoutParams = addImage.getLayoutParams()
layoutParams.width = width * 0.3
layoutParams.height = height * 0.1
addImage.setLayoutParams(layoutParams)
and scales the image. However, I'd like to scale only the width, and have the height scale accordingly so that the image maintains its aspect ratio.
I tried only scaling the width, like this:
val addImage = findViewById<ImageView>(R.id.add_image_signup)
val layoutParams = addImage.getLayoutParams()
layoutParams.width = width * 0.3
addImage.setLayoutParams(layoutParams)
but that seems to have no effect.
Is there a way to only specify the width value, and have the height scale accordingly so that the image maintains its aspect ratio?
Thanks
Upvotes: 0
Views: 816
Reputation: 56
Take the set width and divide it by the aspect ratio to get the height then set it like the code below
Display display = requireActivity().getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
Resources r = getResources();
float density = getResources().getDisplayMetrics().density;
//float dpHeight = outMetrics.heightPixels / density;
float dpWidth = outMetrics.widthPixels / density;
int widthPX = Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, yourImageFixedWidthValue, r.getDisplayMetrics()));
float imageAspectRatio = (float) 335 / 217;
float imageWidth = widthPX;
float imageHeight = imageWidth / imageAspectRatio;
imageView.getLayoutParams().height = Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, imageHeight, r.getDisplayMetrics()));
imageView.setAdjustViewBounds(true);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
Upvotes: 1
Reputation: 113
Add fixed width in the XML file and keep the height as wrap_content and see. I don't think you need to scale it programmatically.
Upvotes: 0