菜单

Draw广告

1. 介绍

Draw广告在原生广告渲染上是比较特殊的一种类型,一般是全屏的方式进行展示的,适用于全屏翻页的信息流广告。其中Draw广告实现渲染方式包括自渲染和模版类型的广告。一般Draw广告的效果如下:

native_draw_demo_pic_thumb

 

2. 集成建议

(1) 启动应用通过ATNative.makeAdRequest来执行加载广告。提前进行广告的请求,以便需要触发广告时可以快速展示。

(2) 建议进入可展示广告场景后调用entryAdScenario(placementId,scenarioId)统计当前广告位的缓存状态,具体的统计说明可查看广告场景区分不同业务场景的数据

(3) 禁止在onNativeAdLoadFail回调中执行广告加载的方法,否则会引起很多无用请求且可能会导致应用卡顿。

(4) 在需要展示原生广告的位置通过ATNative.getNativeAd获取广告对象是否为空:

  • 为空:重新执行ATNative.makeAdRequest来加载广告
  • 不为空:展示NativeAd的广告对象,这时可直接再执行ATNative.makeAdRequest来预加载下一次的广告(只要调用ATNative.getNativeAd之后就可以直接预加载下一次广告)

(5) 建议配置预置策略:提高首次冷启动的广告加载效果,具体说明和接入教程见SDK预置策略使用说明

注意:穿山甲,Pangle需确保创建ATNativeAdView实例时传入的是Activity,快手需要ATNativeAdView高度为match_parent

 

3. 示例代码

具体详细的示例代码可查看Demo:Taku SDK Demo,其中Draw广告集成方式可参考Demo里:NativeDrawVideoActivity.java

3.1 加载广告

ATNative atNative;
NativeAd mNativeAd;

int adViewWidth;
int adViewHeight;

public void loadNativeAd() {
  if (atNative == null) {
     //初始化广告加载对象
      atNative = new ATNative(this, nativeTakuPlacementID, new ATNativeNetworkListener() {
                @Override
                public void onNativeAdLoaded() {
                    Log.i(TAG, "onNativeAdLoaded");
                }

                @Override
                public void onNativeAdLoadFail(AdError adError) {
                    //注意:禁止在此回调中执行广告的加载方法进行重试,否则会引起很多无用请求且可能会导致应用卡顿
                    //AdError,请参考 https://docs.takuad.com/#/zh-cn/android/android_doc/android_test?id=aderror
                    Log.i(TAG, "onNativeAdLoadFail:" + adError.getFullErrorInfo());
                }
            });
   }

    //发起广告请求
    atNative.makeAdRequest();
}

 

3.2 展示广告

ATNativeAdView mATNativeAdView; //渲染广告必须创建的容器
View mSelfRenderView; //开发者自定义布局的容器

public void showNativeAd(ViewGroup adContainer, int adViewWidth) {
     /*
     为了统计场景到达率,相关信息可查阅 "https://help.takuad.com/docs/1RWLAv"
     在满足广告触发条件时调用“进入广告场景”方法,比如:
     ** 广告场景是在清理结束后弹出广告,则在清理结束时调用;
     * 1、先调用 "entryAdScenario"
     * 2、在调用 "ATNative#checkAdStatus#isReady" 是否可展示
     * 3、最后调用 "getNativeAd" 展示
     * 4、scenario 传入场景id后台漏斗报表才会到达场景数据(非必须)
     */
  ATNative.entryAdScenario("your Native placementID", "your scenarioID");
  if (atNative == null){ 
      return; 
  } 
  if(!atNative.checkAdStatus().isReady()){
    return;
  }
  
  if (mATNativeAdView == null) {
     mATNativeAdView = findViewById(R.id.native_ad_view); //可在xml布局定义
  }
  if (mSelfRenderView == null) {
     mSelfRenderView = mATNativeAdView.findViewById(R.id.native_selfrender_view); //可在xml布局定义
  }

  NativeAd nativeAd = atNative.getNativeAd();
  //开发者可以在调用getNativeAd后直接使用ATNative#makeAdRequest发起预加载下一次的广告
  //loadNativeAd();

    if (nativeAd != null) {     
      if (mNativeAd != null) {
           mNativeAd.destory();
      }

      mNativeAd = nativeAd;
            mNativeAd.setNativeEventListener(new ATNativeEventListener() {
            @Override
            public void onAdImpressed(ATNativeAdView view, ATAdInfo atAdInfo) {
                //ATAdInfo可区分广告平台以及获取广告平台的广告位ID等
                //请参考 https://newdocs.takuad.com/docs/JSLSJN
                Log.i(TAG, "native ad onAdImpressed:\n" + atAdInfo.toString());   
            }

            @Override
            public void onAdClicked(ATNativeAdView view, ATAdInfo atAdInfo) {
                Log.i(TAG, "native ad onAdClicked:\n" + atAdInfo.toString());
            }

            @Override
            public void onAdVideoStart(ATNativeAdView view) {
                Log.i(TAG, "native ad onAdVideoStart");
            }

            @Override
            public void onAdVideoEnd(ATNativeAdView view) {
                Log.i(TAG, "native ad onAdVideoEnd");
            }

            @Override
            public void onAdVideoProgress(ATNativeAdView view, int progress) {
                Log.i(TAG, "native ad onAdVideoProgress:" + progress);
            }
        });

     ATNativePrepareInfo nativePrepareInfo;

      if (!mNativeAd.isNativeExpress()) {
            //自渲染、Draw广告
            nativePrepareInfo = new ATNativePrepareInfo();

            bindSelfRenderView(this, mNativeAd.getAdMaterial(), mSelfRenderView, nativePrepareInfo)

            mNativeAd.renderAdContainer(mATNativeAdView, mSelfRenderView);
       } else {
           //模板渲染
            mNativeAd.renderAdContainer(mATNativeAdView, null);
       }

        mNativeAd.prepare(mATNativeAdView, nativePrepareInfo);       
    } 
}

 

public static void bindSelfRenderView(Context context, ATNativeMaterial adMaterial, View selfRenderView, ATNativePrepareInfo nativePrepareInfo) {
        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);

        // bind view
        List 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();
        int realMainImageWidth = context.getResources().getDisplayMetrics().widthPixels - dip2px(context, 10);
        int realMainHeight = 0;
        FrameLayout.LayoutParams mainImageParam = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT
                , FrameLayout.LayoutParams.WRAP_CONTENT);
        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;
        }

        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 (!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
        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


        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

        if (nativePrepareInfo instanceof ATNativePrepareExInfo) {
            List creativeClickViewList = new ArrayList<>();//click views
            creativeClickViewList.add(ctaView);
            ((ATNativePrepareExInfo) nativePrepareInfo).setCreativeClickViewList(creativeClickViewList);//bind custom view list
        }
    }

public static int dip2px(Context context, float dipValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
}

 

3.3 销毁广告

public void destroyAd() {
    if (mNativeAd != null) {
        mNativeAd.destory();
    }
}

 

4. 广告素材说明

可参考自渲染的素材信息说明:自渲染广告素材API说明

最近修改: 2025-05-30Powered by