Размер AdMob Smart Banner в Xamarin Forms
Как рассчитать корректную высоту AdMob Smart Banner в Xamarin Forms на основе density-independent pixels экрана.
В одном из предыдущих постов, How To: Add AdMob to your Xamarin Forms app, я приводил такой кусочек кода:
<controls:AdMobView WidthRequest="320" HeightRequest="50" />
С Banner-объявлениями это работает идеально, но даст сбой, если вы решите использовать Smart Banner. Для Smart Banner размер чуть сложнее - он зависит от высоты устройства. Подробнее о размерах ad units AdMob можно почитать здесь.
| Высота объявления | Высота экрана |
|---|---|
| 32 dp | <= 400 dp |
| 50 dp | > 400 dp и <= 720 dp |
| 90 dp | > 720 dp |
Здесь dps - это density-independent pixels. Не путайте их с разрешением экрана устройства. Эта единица измерения используется и в Android, и в Xamarin Forms для размеров. Чтобы вычислить высоту экрана в dps, мы возьмём разрешение экрана и поделим на density. Это значение density - не DPI экрана, а коэффициент, по которому пиксели группируются в dps. Например, при ширине экрана 1080 пикселей и density 3 фактическая ширина будет 360 dp.
var dpHeight = Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density;
Так получаем высоту экрана в dps. Теперь нужно реализовать логику из таблицы выше и обернуть всё в функцию.
private int GetSmartBannerDpHeight()
{
var dpHeight = Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density;
if (dpHeight <= 400) return 32;
if (dpHeight > 400 && dpHeight <= 720) return 50;
return 90;
}
Renderer AdMob
Готово. Теперь в вашем AdMobRenderer указываете новый размер AdBanner и используете только что реализованный метод, чтобы запросить нужную высоту с учётом экрана устройства. Полный renderer для Android выглядит так:
[assembly: ExportRenderer(typeof(AdMobView), typeof(AdMobRenderer))]
namespace GazetaSporturilor.Droid.Renderers
{
public class AdMobRenderer : ViewRenderer
{
public AdMobRenderer(Context context) : base(context)
{
}
private int GetSmartBannerDpHeight()
{
var dpHeight = Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density;
if (dpHeight <= 400) return 32;
if (dpHeight > 400 && dpHeight <= 720) return 50;
return 90;
}
protected override void OnElementChanged(ElementChangedEventArgs<View> e)
{
base.OnElementChanged(e);
if (Control == null)
{
var ad = new AdView(Context)
{
AdSize = AdSize.SmartBanner,
AdUnitId = "_your_admob_ad_unit_id_goes_here_"
};
var requestbuilder = new AdRequest.Builder();
#if !DEBUG
ad.LoadAd(requestbuilder.Build());
e.NewElement.HeightRequest = GetSmartBannerDpHeight();
#endif
SetNativeControl(ad);
}
}
}
}
Вот, собственно, и всё.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.