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) {}
});
我今天收到一封来自 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) {}
});