我今天收到了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。
答案 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) {}
});