Google Ads MediaView 在显示图片时无法正确地将高度调整为 wrap_content

Google Ads MediaView not correctly resizing height to wrap_content when displaying image

我今天收到一封来自 AdMob 的电子邮件说:

Change to native ads policy: Native ads will require MediaView to render the video or main image asset. In an effort to help you deliver a better ad experience more easily, beginning October 29th, native ads will require MediaView to render the video or main image asset. Ad units not compliant by this date will stop serving ads, which could impact your ad revenue.

我在我的 Android 应用程序中尝试了这个,删除了使用 ImageView 对图像和使用 MediaView 的视频的单独处理,但我发现 MediaView 没有调整视图的高度根据它显示的图像的高度。

在 Google 的 this Codelab 示例中,使用了 MediaView 的固定高度和宽度。我不能这样做,因为这个屏幕对屏幕尺寸有反应,屏幕尺寸会根据设备而变化。图片可以动态调整大小这一事实是使用 UnifiedNativeAds 而不是预定义广告(如横幅)的主要好处之一。

这就是我需要显示 MediaView 的方式,使用 match_parent 宽度和 wrap_content 高度。

<com.google.android.gms.ads.formats.MediaView
            android:id="@+id/ad_media"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:adjustViewBounds="true"
            android:scaleType="fitXY"/>

This is what I am currently getting from the above code

This is what I need and expect it to look like from using wrap_content

在之前我们能够使用 ImageView 单独渲染图像的情况下,wrap_content 值正确调整了图像的大小。

有人对此有解决方法吗?如何在不对 MediaView 的高度进行硬编码的情况下遵循新的 Google 要求?

我的完整代码可以在 github 上的演示应用程序中找到 here

mediaView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
    @Override
    public void onChildViewAdded(View parent, View child) {
        if (child instanceof ImageView) {
            ImageView imageView = (ImageView) child;
            imageView.setAdjustViewBounds(true);
        }
    }

    @Override
    public void onChildViewRemoved(View parent, View child) {}
});

我遇到了同样的问题,经过反复试验后,我发现用 ScrollView 包装 <FrameLayout...>(您在其中添加 UnifiedNativeAdView)将解决这个问题。

for (int i = 0; i < mediaView.getChildCount(); i++) {
    View view = mediaView.getChildAt(i);
    if (view instanceof ImageView) {
        ((ImageView) view).setAdjustViewBounds(true);
    }
}

这适用于 me.I 尝试了理查德的回答,但它在 RecyclerView 中效果不佳。

如果实施高级原生广告,请按照官方文档此处的建议使用 MediaView 的“imageScaleType”属性 https://developers.google.com/admob/android/native/advanced#setting_imagescaletype

adView.mediaView.setImageScaleType(ImageView.ScaleType.CENTER_CROP)

或根据要求的任何其他 ScaleType。

确保所有媒体都尽可能宽并遵守最大高度(因此根据媒体的尺寸不会出现意外)。

XML

<com.google.android.gms.ads.formats.MediaView
     android:id="@+id/ad_media"
     android:layout_gravity="center_horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" />

JAVA

mediaView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
        @Override
        public void onChildViewAdded(View parent, View child) {
            float scale = context.getResources().getDisplayMetrics().density;
            
            int maxHeightPixels = 175;
            int maxHeightDp = (int) (maxHeightPixels * scale + 0.5f);

            if (child instanceof ImageView) { //Images
                ImageView imageView = (ImageView) child;
                imageView.setAdjustViewBounds(true);
                imageView.setMaxHeight(maxHeightDp);

            } else { //Videos
                ViewGroup.LayoutParams params = child.getLayoutParams();
                params.height = maxHeightDp;
                child.setLayoutParams(params);
            }
        }

        @Override
        public void onChildViewRemoved(View parent, View child) {}
    });