测量 Android 中 "fitCenter" imageView 的边距

Measuring margin of a "fitCenter" imageView in Android

给定一个像这样的简单 RelativeLayout:

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

布局边框和图片边框之间的 left/top 间距取决于 imageView 中加载的图片的 W/H 比例。

在此布局中显示图像后,我如何知道(以编程方式)实际边距(青色区域的宽度和高度)?

如果你知道ImageView的宽度,像这样

int ivWidth = iv.getMeasuredWidth(); 

和布局的总宽度(你的RelativeLayout),像这样

int layoutWidth = yourLayout.getWidth();

然后,你可以很容易地得到水平边距,像这样

int horizontalMargin = (layoutWidth - ivWidth)/2; 

身高也是如此。

您应该在计算布局尺寸后调用 getWidthgetHeight 等函数,如 Veer 和 Khan 在 How to get the width and height of an Image View in android? 上的回答所述。 在 onCreate 中调用 getWidthgetHeight 将 return 0.

此方法将计算 新矩形,它在 FIT_CENTER 和所有 其他相关值之后界定对象。

它应该适用于所有对象和容器的情况。

 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

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

您可以使用 FrameLayout 将视图放置在您想要的任何位置,在使用之前的方法以及缩放对象的新 x、y、宽度、高度之后。