Google Ads MediaView在显示图像时未正确将高度调整为wrap_content

时间:2018-08-30 13:15:50

标签: android admob google-dfp native-ads mediaview

我今天收到了AdMob的电子邮件,内容是:

  

更改为原生广告政策:原生广告将需要MediaView来   渲染视频或主图像资产。为了帮助您交付   从10月29日开始,原生广告更容易获得更好的广告体验   将要求MediaView呈现视频或主图像资产。广告   在此日期之前不符合要求的广告单元将停止投放广告,这可能   影响您的广告收入。

我在Android应用程序中尝试了此操作,删除了ImageView对图像的单独处理和MediaView对视频的处理,但是我发现MediaView不会根据高度调整视图高度的大小所显示图像的大小。

在Google的this代码实验室示例中,使用了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

5 个答案:

答案 0 :(得分:13)

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) {}
});

答案 1 :(得分:0)

我遇到了同样的问题,经过反复尝试后,我发现用<FrameLayout...>包装UnifiedNativeAdView(其中您要添加ScrollView)可以解决此问题

答案 2 :(得分:0)

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

这对我有用。我尝试了Richard的回答,但是在RecyclerView中效果不佳。

答案 3 :(得分:0)

如果要实施Advanced Native Ads,请按照官方文档https://developers.google.com/admob/android/native/advanced#setting_imagescaletype

中的建议使用MediaView的“ imageScaleType”属性

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

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

答案 4 :(得分:0)

要确保所有介质尽可能宽,并确保其最大高度(因此,根据介质的尺寸,不要感到意外)。

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) {}
    });