Measuring margin of a “fitCenter” imageView in Android

依然范特西╮ 提交于 2020-01-06 02:41:08

问题


Given a simple RelativeLayout like this:

    <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#0fffff">
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@drawable/img001" />
    </RelativeLayout>

the left/top spacing between the layout border and the image border depends on the W/H ratio of the image being load in the imageView.

How can I know (programmatically) the real margin (width and height of the cyan area) after an image is shown in this layout?


回答1:


This method will calculate the new rectangle which bounds the object after FIT_CENTER and all other related values.

It should work on all cases of object and container.

 public static Rect calculateFitCenterObjectRect(float containerWidth, float containerHeight, float objectWidth, float objectHeight) {

        // scale value to make fit center
        double scale = Math.min( (double)containerWidth / (double)objectWidth, (double)containerHeight / (double)objectHeight);

        int h = (int) (scale * objectHeight); // new height of the object
        int w = (int) (scale * objectWidth); // new width of the object

        int x = (int) ((containerWidth - w) * 0.5f); // new x location of the object relative to the container
        int y = (int) ((containerHeight - h) * 0.5f); // new y  location of the object relative to the container

        // calculate the empty space between the object and the container after fit center
        int marginRight = (int) ((containerWidth - w) * 0.5f);
        int marginLeft = (int) ((containerWidth - w) * 0.5f);
        int marginTop = (int) ((containerHeight - h) * 0.5f);
        int marginBottom = (int) ((containerHeight - h) * 0.5f);

        return new Rect(x, y, x + w, y + h);
    }

You can use FrameLayout to position the view wherever you want after using the previous method with the new x, y, width, height of the scaled object.




回答2:


If you know the width of the ImageView, like this

int ivWidth = iv.getMeasuredWidth(); 

and the total width of the layout (your RelativeLayout), like this

int layoutWidth = yourLayout.getWidth();

then, you can easily get the horizontal margin, like this

int horizontalMargin = (layoutWidth - ivWidth)/2; 

And the same goes for height.

You should call functions like getWidth and getHeight after the dimensions of your layout have been calculated, as described by Veer's and Khan's answer on How to get the width and height of an Image View in android?. Calling getWidth or getHeight in onCreate will return 0.



来源:https://stackoverflow.com/questions/28517181/measuring-margin-of-a-fitcenter-imageview-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!