5

免責事項:これは、Kindle Fireでのみ発生する奇妙な問題です(これまでのところ)。

関係するテクノロジー:Android SDK、Eclipse、LibGDX

LibGDXで実行されている比較的単純なアプリがあります。LibGDXが機能する方法は、Create()(1回)を呼び出してからRender()を可能な限り何度も呼び出すOpenGLスレッドを使用することです(レンダリングを実行できるように…)。

したがって、デバイスを初期化すると、「Create()」メソッドが呼び出され、OpenGLサーフェスが初期化されると(これはすべて自動的に行われます)、Render()が呼び出され始めます。

OpenGLコンテキストが失われたり、破棄されたりした場合、Resize(width、height)メソッドがLibGDXによって呼び出されます。

ここのところ。とても良い。

今、私はKindle Fireで奇妙な問題に遭遇しました。そこでは、物事が数ピクセルずれているか、「カット」されているように見えました。Kindle Fireの画面下部(20ピクセル)には、非表示にしたりスキップしたりできない「ソフトバー」があります。これは、デバイスに物理的なボタンがないため、「大丈夫」です。このソフトバーに触れて、戻ったり、家に帰ったりするために、より大きなバーを取得することが期待されています。Amazonによると、このバーは削除できません。(100%明確ではありませんが、Amazonのルールに違反していない方法を見つけた人は誰もいません)。私が見た中でそれを削除する唯一のアプリは、Amazonのクラウドからのみストリーミングされたビデオ用のAmazonビデオプレーヤーです。ご覧のとおり、そのバーを「永続的に」非表示にする方法はないようです。

したがって、バーがそこにある場合、実際の画面の状態はハードウェア解像度1024x600(横向き)ではなく1024x580です。そこで、何が起こっているかを確認するためにメソッドにログを追加しましたが、これに驚いていました…(create()、render()、resize()メソッドを思い出してください):

12-23 15:17:04.119: I/myapp(19921): SCREEN HEIGHT AT CREATE(): 600
[snip other unrelated log stuff]
12-23 15:17:04.673: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 600
[snip other unrelated log stuff]
12-23 15:17:04.705: I/myapp(19921): MyApp - Resize() Called.
12-23 15:17:04.705: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 580

そのため、画面は「ある時点で」KindleFireによって「サイズ変更」されました。

誰かがこのようなものに出くわしたことがありますか?

これはスクリーンショットです(上部の黒いバーに注意してください。これは私が追加したものではありません!)。画像がぼやけていることをお許しください。これはクライアントのプロジェクトであり、何も「開示」できません。

ここに画像の説明を入力してください

楽しい部分は、時々、バーがそこになく、アプリが次のように見えるときに始まります(繰り返しますが、ぼやけてください)。トップバーがないことに注意してください…</p>

ここに画像の説明を入力してください

両方のショットを詳しく調べると、下部(同じである必要があります)はそうではないことがわかります。Kindleは奇妙なことをしています。

何か案は?

アセットは元々1024x600としてパックされていましたが、これを変更し(現在は580)、ビューポートは1024x580であると想定しますが、このナンセンスに対処するためのより良い方法を誰かが見つけたかどうか疑問に思いました。:)

:マニフェストにはandroid:theme = "@ android:style/Theme.NoTitleBar.Fullscreen"があります。何もしません。

前もって感謝します。

4

3 に答える 3

6

Kindle Fireの動作はおかしいです。アプリが読み込まれると、画面が20ピクセル上(ソフトバーの高さ)に「移動」するように見えるため、アプリは数ピクセルずれているか、カットされているように見えます。これは、GLSurfaceViewを作成してレンダラーを設定すると、 onSurfaceChangedメソッドが2回呼び出されるためです。

1回目はonSurfaceCreatedが呼び出された後、解像度の値は1024x600で、2回目はonDrawFrameが最初に呼び出された後の値が1024x580です。

解決策として、onSurfaceChangedへの2つの呼び出しを制御し、openglビューポートのサイズを変更する必要があります。

    private static boolean appStarted = false;
    ...

    private static class Renderer implements GLSurfaceView.Renderer 
    {
        public void onSurfaceChanged(GL10 gl, int width, int height) 
        {
            if ( !appStarted )
            {
                 //Initialization (Resolution 1024x600)
            }
            else
            {
                 //Second call, screen resolution changed (Resolution 1024x580)
                 //Resize(width,height)
            }   
            appStarted = true;
        }

        public void onDrawFrame(GL10 gl) {
        //Render()
        }

        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //Create()
        }
    }
于 2012-02-10T09:03:11.170 に答える
1

これを使用してみてください:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

ソース:https ://developer.amazon.com/help/faq.html?ref_ = pe_132830_21362890#KindleFire

于 2012-02-03T00:29:47.057 に答える
0

私は最近この問題に遭遇しました、そしてあなたがすでに解決策を見つけたかどうか疑問に思いました。

アプリが高さを580ピクセルと報告しているため、黒いバーが表示されます。OpenGLには、(0,0)が画面の左下隅にある座標系があります。

何らかの理由で、KindleのソフトバーはEGLSurfaceを20ピクセル上に移動していません。ただし、サイズを変更すると、サイズが20ピクセル小さくなり、黒いバーが残ります。したがって、問題はEGLSurfaceの場所です。また、タイミングにより、サイズ変更後に再配置が発生する場合があります(黒いバーが消えます)。

于 2012-07-11T09:01:38.237 に答える