私は縦向きの画面向きのAndroidゲームを作っています。スマートフォンで実行するとうまくいきますが、タブレットで実行すると、画面サイズが大きくても、ビットマップはすべて同じサイズです。異なるサイズの画面でもビットマップを同じ比率に保つ方法はありますか?
私は縦向きの画面向きのAndroidゲームを作っています。スマートフォンで実行するとうまくいきますが、タブレットで実行すると、画面サイズが大きくても、ビットマップはすべて同じサイズです。異なるサイズの画面でもビットマップを同じ比率に保つ方法はありますか?
回答:
AbsoluteLayoutを使用している場合を除き(通常、x / y座標を使用してレイアウトを設計するため、非常に悪い考えです。これは、設計されているデバイスにのみ適しています)、Androidアプリケーションはデバイスの画面サイズに自動的に調整されます。 。しかし、あなたが説明したものから(レイアウトはテーブル画面に合わせて調整されません)、AbsoluteLayoutがここでの問題のように思えます。
レイアウトXMLファイルで絶対レイアウトを使用していないことを確認してください(これには、あらゆる種類のビューでの明示的な座標/幅/高さの設定が含まれます)。代わりに、次の使用を検討してください。
...目的に最も適したもの。
Androidを初めて使用する場合、Googleは上記のさまざまなレイアウトタイプを紹介する素晴らしいチュートリアルを提供しています。その他のチュートリアルはここにあります。
さらに、問題の原因を解明するために、APIレベルが関連します(Android 2.xを使用しているか、4.xを使用しているかを知るには-3.xはスマートフォンでは使用できないため、想定していません)。
次の設定により、アプリケーションをポートレートモードに強制しますか?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set screen orientation for this dialog to portrait
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
...ゲームのビューを表示するあなたのアクティビティで?
ビューのレイアウト方法に関する詳細情報を提供してください(アクティビティで後でインフレートするレイアウトにXMLを使用していますか、それともアクティビティなどでコード内レイアウトを使用していますか?)?さらに、スマートフォンとタブレットサイズのエミュレーターでアプリを実行してみましたか?はいの場合、問題は解決しませんか?
更新:ビットマップのスケーリング方法
OPは、ゲームで使用しているビットマップのスケーリング方法を尋ねました。1つのオプション(私がOPのセットアップについて知っているすべてから):ゲームを表示するためにオーバーライドし、すべてのビットマップなどをレンダリングするSurfaceHolder.Callbackには、次のメソッドが呼び出されます。
surfaceChanged(SurfaceHolder holder, int format, int width, int height)
その方法はあなたの表面の幅/高さを与えるので、あなたは今使うことができます:
Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)
ビットマップクラスから。描画する表面のサイズに比例して画像のサイズを変更するには。
あなたがする必要があるのはこれです:あなたがスマートフォンの画面サイズなど、与えられた画面サイズに関連してビットマップの寸法を知っているなら。次に、スケーリングされたビットマップのターゲットディメンションを計算できます。これが数学です(例にラップされています):
あなたが持っていると言うビットマップAを寸法で25x50(幅x高さ)寸法(幅x高さ)100x200で画面上に表示されます。その画面サイズ(100x200)の場合、ビットマップのサイズは適切です。ビットマップを大きな画面に表示する場合は、次のことを行う必要があります。
大きな画面が200x300(widthxheight)であるとすると、幅の倍率は次のようになります。
200(target screen width)/100(default screen width) = 2
したがって、2はビットマップの幅と高さの値のスケール係数です。ビットマップのアスペクト比を維持する必要があるため、ビットマップの幅と高さをスケール係数に乗算するだけです。
bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight
したがって、上記の例のビットマップAと前述の数式を使用すると、ビットマップの新しい寸法は50x100(widthxheight)になります。
2*25(width) = 50 height
2*50(height) = 100 height
ビットマップの新しいサイズがわかったので、前述のAPI呼び出しを使用して、空白を埋めます。
Bitmap.createScaledBitmap (myBitmap, 50, 100, false)
上記の例のmyBitmapは、寸法が25x50で、上記のコードスニペットを使用して50x100にスケーリングされた元のビットマップAです。
ただし、これは、タブレットサイズのデバイスの右上隅のみを占めるアプリケーションの元の問題を解決しません。その1つに答えるために、セットアップに関してお伺いした質問への回答が必要です。ここで簡単にまとめます。
一般的な疑い:すべてのスマートフォンが同じ画面サイズを備えているわけではなく、実際にはさまざまな画面サイズがあるため、疑問に思っています。画面とは異なる画面サイズのスマートフォンでアプリをテストしたことはありますか?なぜなら、それはあなたの画面にフィットしますが、タブレットにはフィットしないという事実は、それらの寸法を誰がいつ設定するのか疑問に思います。アプリがすべてのスマートフォンの画面サイズに調整できるが、タブレットのサイズには調整できないのではないかと思うので、あまり意味がありません(同じAndroidコアが実行されているため、sxと3。 xと4.xは別にして)タブレットサイズの画面サイズをサポートしていないフレームワークを使用している場合を除いて(何らかの理由で-タブレットサポートを追加で購入する必要があるかもしれません)。だからこそ、アプリがスマートフォンでのみ適切にサイズ変更されるかどうかを知ることが非常に重要です。または他のスマートフォンでも。アプリを特定の1つの電話の画面サイズに制限する方法を知っている唯一の方法は、AbsoluteLayoutとウィジェットの一般的な絶対寸法などを使用することです...
更新:x / y座標のスケーリング
ビットマップの位置を画面サイズに調整するには、次のようなものがうまくいくはずです。
ここで、画面サイズを大きくする場合は、これらのx / y値をスケーリングする必要があります。
幅と高さが等しく2増加したため、スケール係数は2になります。したがって、寸法は...
別の試み-今回は幅/高さの異なるスケール係数を使用
新しいターゲット画面が150/250の場合、計算は次のようになります。
ここで、x / y座標をスケーリングする必要があります。xは幅スケールを使用してスケーリングされ、高さは高さスケールを使用してスケーリングされます。結果は次のとおりです。
したがって、新しい画面寸法とスケーリングされたx / y座標は次のとおりです。
簡単に言えば、ビットマップをスケーリングするアルゴリズムは次のとおりです。
X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate
:Android.comに良いと関連記事があり http://developer.android.com/guide/practices/screens_support.htmlは、
このリファレンスは、画面サイズ、画面密度、解像度を並べ替えるのに役立ちます。目標は、Android APIを使用して「密度非依存性」を実現し、ユーザーインターフェイスコンポーネントとグラフィックがさまざまなデバイスで見栄えよく見えるようにすることです。
レイアウトと外観をテストしているときに、エミュレータ用のAndroid仮想デバイスのさまざまな構成を作成することもできます。http: //developer.android.com/guide/developing/devices/emulator.html