💡Tips
- 🚀 采用预加载机制提升用户体验
- ⚠️ 注意处理生命周期防止内存泄漏
- 🔧 推荐使用标准化回调处理流程
ATAdxNative atAdxNative = new ATAdxNative(activity, "your placement id");
atAdxNative.setListener(new ATAdxNativeListener() {
@Override
public void onNativeAdLoaded(ATAdInfo atAdInfo, ATAdxNativeAd atAdxNativeAd) {
//广告加载成功
}
@Override
public void onNativeAdLoadFail(AdError error) {
//广告加载失败
});
atAdxNative.makeAdRequest();
ATNativeAdView mATNativeView; //渲染广告必须创建的容器
View mSelfRenderView; //开发者自定义布局的容器
private void showNativeAd(ATAdxNativeAd atAdxNative){
NativeAd nativeAd = atAdxNative;
if (nativeAd != null) {
if (mNativeAd != null) {
mNativeAd.destory();
}
mNativeAd = nativeAd;
mNativeAd.setAdRevenueListener(new AdRevenueListenerImpl());
mNativeAd.setNativeEventListener(new ATNativeEventExListener() {
@Override
public void onDeeplinkCallback(ATNativeAdView view, ATAdInfo adInfo, boolean isSuccess) {
//Deeplink回调
}
@Override
public void onAdImpressed(ATNativeAdView view, ATAdInfo entity) {
//广告展示回调
}
@Override
public void onAdClicked(ATNativeAdView view, ATAdInfo entity) {
//广告点击回调
}
@Override
public void onAdVideoStart(ATNativeAdView view) {
//视频开始播放回调
}
@Override
public void onAdVideoEnd(ATNativeAdView view) {
//视频播放结束回调
}
@Override
public void onAdVideoProgress(ATNativeAdView view, int progress) {
//播放进度回调
});
mNativeAd.setDislikeCallbackListener(new ATNativeDislikeListener() {
@Override
public void onAdCloseButtonClick(ATNativeAdView view, ATAdInfo entity) {
//广告关闭回调
}
});
mATNativeView.removeAllViews();
ATNativePrepareInfo mNativePrepareInfo = null;
try {
mNativePrepareInfo = new ATNativePrepareExInfo();
if (mNativeAd.isNativeExpress()) {
//模板渲染
mNativeAd.renderAdContainer(mATNativeView, null);
} else {
//自渲染
SelfRenderViewUtil.bindSelfRenderView(this, mNativeAd.getAdMaterial(), mSelfRenderView, mNativePrepareInfo);
mNativeAd.renderAdContainer(mATNativeView, mSelfRenderView);
}
} catch (Exception e) {
e.printStackTrace();
}
mNativeAd.prepare(mATNativeView, mNativePrepareInfo);
mATNativeView.setVisibility(View.VISIBLE);
mPanel.setVisibility(View.VISIBLE);
initPanelButtonList(mNativeAd.getAdMaterial());
} else {
printLogOnUI("no cache!");
}
}
public static void bindSelfRenderView(Context context, ATNativeMaterial adMaterial, View selfRenderView, ATNativePrepareInfo nativePrepareInfo) {
//log
printNativeAdMaterial(adMaterial);
int padding = dip2px(context, 5);
selfRenderView.setPadding(padding, padding, padding, padding);
TextView titleView = (TextView) selfRenderView.findViewById(R.id.native_ad_title);
TextView descView = (TextView) selfRenderView.findViewById(R.id.native_ad_desc);
TextView ctaView = (TextView) selfRenderView.findViewById(R.id.native_ad_install_btn);
TextView adFromView = (TextView) selfRenderView.findViewById(R.id.native_ad_from);
FrameLayout iconArea = (FrameLayout) selfRenderView.findViewById(R.id.native_ad_image);
FrameLayout contentArea = (FrameLayout) selfRenderView.findViewById(R.id.native_ad_content_image_area);
final ATNativeImageView logoView = (ATNativeImageView) selfRenderView.findViewById(R.id.native_ad_logo);
View closeView = selfRenderView.findViewById(R.id.native_ad_close);
FrameLayout shakeViewContainer = (FrameLayout) selfRenderView.findViewById(R.id.native_ad_shake_view_container);
FrameLayout slideViewContainer = (FrameLayout) selfRenderView.findViewById(R.id.native_ad_slide_view_container);
FrameLayout adLogoContainer = selfRenderView.findViewById(R.id.native_ad_logo_container); //v6.1.52+
// bind view
if (nativePrepareInfo == null) {
nativePrepareInfo = new ATNativePrepareInfo();
}
List<View> clickViewList = new ArrayList<>();//click views
String title = adMaterial.getTitle();
// title
if (!TextUtils.isEmpty(title)) {
titleView.setText(title);
nativePrepareInfo.setTitleView(titleView);//bind title
clickViewList.add(titleView);
titleView.setVisibility(View.VISIBLE);
} else {
titleView.setVisibility(View.GONE);
}
String descriptionText = adMaterial.getDescriptionText();
if (!TextUtils.isEmpty(descriptionText)) {
// desc
descView.setText(descriptionText);
nativePrepareInfo.setDescView(descView);//bind desc
clickViewList.add(descView);
descView.setVisibility(View.VISIBLE);
} else {
descView.setVisibility(View.GONE);
}
// icon
View adIconView = adMaterial.getAdIconView();
String iconImageUrl = adMaterial.getIconImageUrl();
iconArea.removeAllViews();
final ATNativeImageView iconView = new ATNativeImageView(context);
if (adIconView != null) {
iconArea.addView(adIconView);
nativePrepareInfo.setIconView(adIconView);//bind icon
clickViewList.add(adIconView);
iconArea.setVisibility(View.VISIBLE);
} else if (!TextUtils.isEmpty(iconImageUrl)) {
iconArea.addView(iconView);
iconView.setImage(iconImageUrl);
nativePrepareInfo.setIconView(iconView);//bind icon
clickViewList.add(iconView);
iconArea.setVisibility(View.VISIBLE);
} else {
iconArea.setVisibility(View.INVISIBLE);
}
// cta button
String callToActionText = adMaterial.getCallToActionText();
if (!TextUtils.isEmpty(callToActionText)) {
ctaView.setText(callToActionText);
nativePrepareInfo.setCtaView(ctaView);//bind cta button
clickViewList.add(ctaView);
ctaView.setVisibility(View.VISIBLE);
} else {
ctaView.setVisibility(View.GONE);
}
// media view
View mediaView = adMaterial.getAdMediaView(contentArea);
int mainImageHeight = adMaterial.getMainImageHeight();
int mainImageWidth = adMaterial.getMainImageWidth();
FrameLayout.LayoutParams mainImageParam = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT
, FrameLayout.LayoutParams.WRAP_CONTENT);
if (mediaView == null) {
ViewTreeObserver viewTreeObserver = selfRenderView.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// 移除监听器
selfRenderView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int realMainImageWidth = selfRenderView.getWidth() - dip2px(context,
10);
int realMainHeight = 0;
if (mainImageWidth > 0 && mainImageHeight > 0 && mainImageWidth > mainImageHeight) {
realMainHeight = realMainImageWidth * mainImageHeight / mainImageWidth;
mainImageParam.width = realMainImageWidth;
mainImageParam.height = realMainHeight;
} else {
mainImageParam.width = FrameLayout.LayoutParams.MATCH_PARENT;
mainImageParam.height = realMainImageWidth * 600 / 1024;
}
}
});
} else {
int realMainImageWidth = context.getResources()
.getDisplayMetrics().widthPixels - dip2px(context, 10);
if (context.getResources().getDisplayMetrics().widthPixels > context.getResources()
.getDisplayMetrics().heightPixels) {//Horizontal screen
realMainImageWidth = context.getResources()
.getDisplayMetrics().widthPixels - dip2px(context, 10) - dip2px(context,
330) - dip2px(context, 130);
}
if (mainImageWidth > 0 && mainImageHeight > 0 && mainImageWidth > mainImageHeight) {
mainImageParam.width = FrameLayout.LayoutParams.MATCH_PARENT;
mainImageParam.height = realMainImageWidth * mainImageHeight / mainImageWidth;
} else {
mainImageParam.width = FrameLayout.LayoutParams.MATCH_PARENT;
mainImageParam.height = realMainImageWidth * 600 / 1024;
}
}
List<String> imageList = adMaterial.getImageUrlList();
contentArea.removeAllViews();
if (mediaView != null) {
if (mediaView.getParent() != null) {
((ViewGroup) mediaView.getParent()).removeView(mediaView);
}
mainImageParam.gravity = Gravity.CENTER;
mediaView.setLayoutParams(mainImageParam);
contentArea.addView(mediaView, mainImageParam);
//clickViewList.add(mediaView);
contentArea.setVisibility(View.VISIBLE);
} else if (imageList != null && imageList.size() > 1) {
MutiImageView mutiImageView = new MutiImageView(context);
mutiImageView.setImageList(imageList, mainImageWidth, mainImageHeight);
nativePrepareInfo.setMainImageView(mutiImageView);//bind main image
contentArea.addView(mutiImageView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
clickViewList.add(mutiImageView);
} else if (!TextUtils.isEmpty(adMaterial.getMainImageUrl())) {
ATNativeImageView imageView = new ATNativeImageView(context);
imageView.setImage(adMaterial.getMainImageUrl());
imageView.setLayoutParams(mainImageParam);
contentArea.addView(imageView, mainImageParam);
nativePrepareInfo.setMainImageView(imageView);//bind main image
clickViewList.add(imageView);
contentArea.setVisibility(View.VISIBLE);
} else {
contentArea.removeAllViews();
contentArea.setVisibility(View.GONE);
}
//Ad Logo
View adLogoView = adMaterial.getAdLogoView();
if (adLogoView != null) {
adLogoContainer.setVisibility(View.VISIBLE);
adLogoContainer.removeAllViews();
adLogoContainer.addView(adLogoView);
} else {
adLogoContainer.setVisibility(View.GONE);
String adChoiceIconUrl = adMaterial.getAdChoiceIconUrl();
Bitmap adLogoBitmap = adMaterial.getAdLogo();
if (!TextUtils.isEmpty(adChoiceIconUrl)) {
logoView.setImage(adChoiceIconUrl);
nativePrepareInfo.setAdLogoView(logoView);//bind ad choice
logoView.setVisibility(View.VISIBLE);
} else if (adLogoBitmap != null) {
logoView.setImageBitmap(adLogoBitmap);
logoView.setVisibility(View.VISIBLE);
} else {
logoView.setImageBitmap(null);
logoView.setVisibility(View.GONE);
}
}
String adFrom = adMaterial.getAdFrom();
// ad from
if (!TextUtils.isEmpty(adFrom)) {
adFromView.setText(adFrom);
adFromView.setVisibility(View.VISIBLE);
} else {
adFromView.setVisibility(View.GONE);
}
nativePrepareInfo.setAdFromView(adFromView);//bind ad from
//渲染摇一摇组件,若广告不支持摇一摇能力则返回null,目前只有百度广告平台支持
renderShakeView(context, adMaterial, shakeViewContainer);
//渲染滑一滑组件,若广告不支持则返回null,滑动区域受容器大小控制,目前只有百度广告平台支持
renderSlideView(context, adMaterial, slideViewContainer);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(dip2px(context, 40), dip2px(context, 10));//ad choice
layoutParams.gravity = Gravity.BOTTOM | Gravity.RIGHT;
nativePrepareInfo.setChoiceViewLayoutParams(layoutParams);//bind layout params for ad choice
nativePrepareInfo.setCloseView(closeView);//bind close button
nativePrepareInfo.setClickViewList(clickViewList);//bind click view list
View sixInfoView = selfRenderView.findViewById(R.id.six_info);
ATAdAppInfo adAppInfo = adMaterial.getAdAppInfo();
if (adAppInfo != null) {
sixInfoView.setVisibility(View.VISIBLE);
TextView functionTextView = sixInfoView.findViewById(R.id.function_test);
TextView developerTextView = sixInfoView.findViewById(R.id.developer_test);
TextView versionTextView = sixInfoView.findViewById(R.id.version_test);
TextView privacyTextView = sixInfoView.findViewById(R.id.privacy_test);
TextView permissionTextView = sixInfoView.findViewById(R.id.permission_test);
List<View> appInfoClickViewList = new ArrayList<>();
List<View> privacyClickViewList = new ArrayList<>();
List<View> permissionClickViewList = new ArrayList<>();
developerTextView.setText(
TextUtils.isEmpty(adAppInfo.getPublisher()) ? "" : adAppInfo.getPublisher());
versionTextView.setText(
TextUtils.isEmpty(adAppInfo.getAppVersion()) ? "" : adAppInfo.getAppVersion());
appInfoClickViewList.add(developerTextView);
appInfoClickViewList.add(versionTextView);
appInfoClickViewList.add(functionTextView);
if (!TextUtils.isEmpty(adAppInfo.getFunctionUrl())) {
functionTextView.setVisibility(View.VISIBLE);
setOpenUrlClickListener(functionTextView, adAppInfo.getFunctionUrl());
} else {
functionTextView.setOnClickListener(null);
functionTextView.setVisibility(View.GONE);
}
privacyClickViewList.add(privacyTextView);
if (!TextUtils.isEmpty(adAppInfo.getAppPrivacyUrl())) {
privacyTextView.setVisibility(View.VISIBLE);
setOpenUrlClickListener(privacyTextView, adAppInfo.getAppPrivacyUrl());
} else {
privacyTextView.setVisibility(View.GONE);
privacyTextView.setOnClickListener(null);
}
permissionClickViewList.add(permissionTextView);
if (!TextUtils.isEmpty(adAppInfo.getAppPermissonUrl())) {
permissionTextView.setVisibility(View.VISIBLE);
setOpenUrlClickListener(permissionTextView, adAppInfo.getAppPermissonUrl());
} else {
permissionTextView.setVisibility(View.GONE);
permissionTextView.setOnClickListener(null);
}
if (nativePrepareInfo instanceof ATNativePrepareExInfo) {
((ATNativePrepareExInfo) nativePrepareInfo).setAppInfoClickViewList(
appInfoClickViewList);
((ATNativePrepareExInfo) nativePrepareInfo).setPermissionClickViewList(
permissionClickViewList);
((ATNativePrepareExInfo) nativePrepareInfo).setPrivacyClickViewList(
privacyClickViewList);
}
} else {
sixInfoView.setVisibility(View.GONE);
}
}
可参考此文档:客户端竞价