AdMob和不同的屏幕分辨率/ DPI /比率

时间:2014-04-15 22:46:10

标签: android admob opengl-es-2.0 scaling banner-ads

我正在使用一个简单的横幅添加到我的应用程序(使用openGL ES 2.0编写的游戏) - 请注意,我没有使用任何XML,一切都在代码中完成

我已经尝试使用谷歌这个并环顾四周但我找不到任何信息 - 我们如何在使用AdMob时处理屏幕碎片?

我的应用已锁定在横向模式

例如,我在平板电脑上运行我的应用程序(分辨率为2560 x 1600),一切看起来都很棒:

enter image description here

然后我在旧的Galaxy Ace手机(分辨率为480 x 320)上运行它,我明白了:

enter image description here

显然,出于多种原因这是错误的(横幅太大,一般来说太靠近控件,当我真的希望它只延伸到GLViewPort的底部时延伸到屏幕的底部(如果这是甚至可能) - 基本上,我的游戏中的每个对象都会缩放,以便在每个屏幕/ DPI上以相同的相对大小显示,并保留其预期的比率。我花了很长时间时间确保游戏在每台设备上的外观和感觉都一样!

实际上,横幅在手机上完全没用。我坚持这个吗?我能在这做什么吗?我可以把横幅缩小吗?有什么办法我可以自己扩展它吗?基本上,我想我所问的是,我对这些横幅有任何真正的控制吗?

我也查看了Google的官方文档,但我发现它并不好。 AdMob的帮助也是如此。

我是AdMob的新手,并且一直在努力想办法做到这一点,任何帮助都会受到赞赏。

代码:

代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        // Create an ad.
        adView = new AdView(this);
        adView.setAdSize(AdSize.BANNER);
        adView.setAdUnitId(AD_UNIT_ID);

        // Add the AdView to the view hierarchy. The view will have no size
        // until the ad is loaded.
        RelativeLayout layout = new RelativeLayout(this);
        layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,    LayoutParams.MATCH_PARENT));

        // Create an ad request. Check logcat output for the hashed device ID to
        // get test ads on a physical device.
        AdRequest adRequest = new AdRequest.Builder()
          .addTestDevice(TestDeviceID)
          .build();

        // Start loading the ad in the background.
        adView.loadAd(adRequest);

        //Request full screen
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //Create a displayMetrics object to get pixel width and height
        metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        width = metrics.widthPixels;
        height = metrics.heightPixels;

        //Work out values for resizing screen while keeping aspect ratio

        width = (int) Math.min(width, height * 1.702127659574468);
        height = (int) Math.min(height, width / 1.702127659574468);

        //Create and set GL view (OpenGL View)
        myView = new MyGLSurfaceView(MainActivity.this);

        RelativeLayout.LayoutParams adParams = 
                new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                RelativeLayout.LayoutParams.WRAP_CONTENT);
                adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                adParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

        //Set the colour if we don't, the ad won't show (bug?)
        adView.setBackgroundColor(Color.BLACK);
        layout.addView(myView);
        layout.addView(adView, adParams);

        //Create a copy of the Bundle
        if (savedInstanceState != null){
            newBundle = new Bundle(savedInstanceState);         
        }


        setContentView(layout);

}

4 个答案:

答案 0 :(得分:2)

Zippy,您可以根据屏幕分辨率动态加载广告:

        AdSize adSize = AdSize.SMART_BANNER;

        DisplayMetrics dm = getResources().getDisplayMetrics();

        double density = dm.density * 160;
        double x = Math.pow(dm.widthPixels / density, 2);
        double y = Math.pow(dm.heightPixels / density, 2);
        double screenInches = Math.sqrt(x + y);

        if (screenInches > 8) { // > 728 X 90
            adSize = AdSize.LEADERBOARD;
        } else if (screenInches > 6) { // > 468 X 60
            adSize = AdSize.MEDIUM_RECTANGLE;
        } else { // > 320 X 50
            adSize = AdSize.BANNER;
        }



// Create an ad.
        adView = new AdView(this);
        adView.setAdSize(adSize);
        adView.setAdUnitId(AD_UNIT_ID);

对于其他横幅尺寸,请查看横幅广告。官方page

答案 1 :(得分:2)

啊!我在晚会上迟到了。这就是我为解决同样的问题所做的。我希望它能帮助未来的读者:

使用智能横幅,因为它会根据设备大小自动决定广告的高度。使用整个屏幕宽度来显示广告。

来自Android开发者site

  

智能横幅是一种广告单元,可以在任意方向上跨不同设备在任何屏幕尺寸上呈现屏幕范围的横幅广告。智能横幅有助于解决不同设备之间不断增加的屏幕碎片问题。" smartly"检测手机当前方向的宽度,并使广告视图大小。

     

有三个广告高度(以dp为单位,与密度无关的像素):

     

32 - 当设备的屏幕高度小于400时使用   50 - 当设备的屏幕高度介于400和720之间时使用   90-当设备的屏幕高度大于720时使用

现在,获取AdView的高度并调整您希望放置横幅广告的布局边距。

public static int getAdViewHeightInDP(Activity activity) {
        int adHeight = 0;

        int screenHeightInDP = getScreenHeightInDP(activity);
        if (screenHeightInDP < 400)
            adHeight = 32;
        else if (screenHeightInDP >= 400 && screenHeightInDP <= 720)
            adHeight = 50;
        else
            adHeight = 90;

        return adHeight;
    }

public static int getScreenHeightInDP(Activity activity) {
        DisplayMetrics displayMetrics = ((Context) activity).getResources().getDisplayMetrics();

        float screenHeightInDP = displayMetrics.heightPixels / displayMetrics.density;

        return Math.round(screenHeightInDP);
    }

答案 2 :(得分:1)

您给出的横幅尺寸对于该尺寸和密度手机(320 * 50)是正确的。你不能得到一个比这更小的横幅。在平板电脑上,您还要求并显示手机大小的横幅广告。在平板电脑上渲染时,您通常会显示更大格式的广告(或使用SmartBanner为您选择)。

您将不得不考虑如何在横幅广告和游戏UI之间共享屏幕。看来你已经将GameUI集中在手机上并且在上方和下方都有空间。看起来如果您将游戏用户界面与顶部对齐,您就可以获得横幅广告的空间。

如果您使用XML进行布局,那将会更容易。

答案 3 :(得分:0)

我只是想补充一点,您可以改为使用原生广告,并根据自己的规则自行解决。

您可以通过创建自己的布局并为您添加的每个视图填充数据来做到这一点。