1

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

我试过用谷歌搜索这个并在 SO 上四处寻找,但我根本找不到任何信息 - 我们如何在使用 AdMob 时处理屏幕碎片?

我的应用程序被锁定为横向模式

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

在此处输入图像描述

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

在此处输入图像描述

显然,由于多种原因,这是错误的(横幅通常太大,太靠近控件,向下延伸到屏幕底部,而我真的希望它只向下延伸到 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

4 回答 4

2

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

        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);

对于其他横幅尺寸,请查看横幅的官方页面

于 2014-04-16T00:21:39.483 回答
2

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

使用智能横幅,因为它会根据设备尺寸自动决定广告的高度。使用全屏显示广告。

来自 android 开发者网站

智能横幅广告单元可以在任何屏幕尺寸上以任一方向在不同设备上呈现全屏横幅广告。智能横幅通过“智能”检测手机在当前方向上的宽度,并使广告视图具有该尺寸,从而帮助处理不同设备上日益增加的屏幕碎片。

提供三种广告高度(以 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);
    }
于 2015-07-10T18:29:10.563 回答
1

您获得的横幅尺寸适合该尺寸和密度的手机 (320*50)。你不能得到比这更小的横幅。在您的平板电脑上,您还要求并显示手机大小的横幅广告。在平板电脑上呈现时,您通常会显示较大格式的广告(或使用 SmartBanner 为您选择)。

您将不得不考虑如何在横幅广告和游戏 UI 之间共享屏幕。看来您已将 GameUI 置于手机的中心,并在上方和下方留有空间。看起来如果您将游戏 UI 与顶部对齐,您将有空间放置横幅广告。

如果您使用 XML 进行布局,这会容易得多。

于 2014-04-16T05:19:57.650 回答
0

I just wanted to add that you could use native ads instead, and solve it on your own, by your own rules.

You do this by creating your own layout and fill the data for each of the Views you've added.

于 2020-08-03T14:53:12.617 回答