2

サーフェスパネルを使ったゲームを開発しています。複数のデバイスのキャンバスでドローアブルを適切にスケーリングおよび配置する方法について多くの調査を行い、携帯電話では正常に機能するが、タブレットで試してみるといくつかの欠陥があるソリューションを思いつきました。タブレットにさまざまなリソースを使用できることは承知しています (そして、最終的にはそうする可能性があります) が、今はそうしたくないと仮定しましょう。市場に出回っているすべての異なる電話に同じリソースを使用したいと考えています。 .

私が持っているすべてのリソースは hdpi フォルダーにあり、480x800 デバイス用に適切なサイズになっています。

私のアプローチは、ここで説明されているものと似ています。以下の説明をご覧ください。この問題に対するより良い解決策があるかどうかを知りたいです!

アプリをテストするための Galaxy S2 があります。したがって、私の最初のアプローチは、すべての最適な位置を試して見つけることで、手動ですべてをキャンバスに直接挿入することでした。例として、最初の文字位置を取り上げます。

draw_x = (float) (19);
draw_y = (float) (279);
canvas.drawBitmap(toDrawBitmap, draw_x, draw_y, null);

さまざまなデバイスで最初にテストしたとき、すべてが混乱していて、スケールアウトしていました。そのため、リソースをスケーリングするために密度を使用することを考えました。

 // I am dividing by 1.5 because my initial positions are on a high density device
 // so when it goes for a medium density it should scale for 0.66 and a small density 
 // for 0.5 of my positions. 
 float scale = getResources().getDisplayMetrics().density /1.5;
 draw_x = (float) (19) * scale;
 draw_y = (float) (279) * scale;
 canvas.drawBitmap(toDrawBitmap, draw_x, draw_y, null);

そして、第一印象では、これは魅力のように機能しました。私のキャラクターはすべて適切な位置にありました。しかし、私が使用しているGalaxy S2と比較して、デバイスの幅/高さが異なる場合、問題が発生することに気付きました. すべてが適切に配置されましたが、画像の一部が画面から切り取られましたが、キャンバスは電話の画面よりも大きく計算されました。

Galaxy S2 は 480x800 です。私の背景も 480x800 です。エミュレーターで小さな画面解像度 320x480 でテストしたところ、Android は期待どおりに背景を正しくスケーリングしませんでした。適切な解像度にスケーリングする代わりに、キャンバスの 320x533 よりも大きな背景が得られました。

簡単な計算で、320x533 / 480x800 = 0.66 と計算します。そのため、キャンバスの背景を適切にスケーリングする代わりに、デバイスの密度を使用してスケーリングしました。

したがって、この問題に対する私の回避策は、私が考えることができる最も簡単なものでした。背景の解像度と電話の解像度を知っているので、必要な比率を計算してサイズ変更を強制できます。

 //Set the proportions for scaling in multiple devices
 public void setProportions(float screenWidth,float ScreenHeight,Bitmap background){

     this.heightProportion = ScreenHeight/background.getHeight();
     this.widthProportion = screenWidth/background.getWidth();

 }  

 public Bitmap scaleBitmaps(Bitmap bitmap) { 
         Bitmap out = Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() * widthProportion), 
                    (int)  (bitmap.getHeight()*heightProportion), false);         
         return out;
     }

これはドローアブルのサイズでは問題なく機能したので、スケールと固定サイズの背景画像を使用して計算できたこの新しい比率を使用して、位置についても同じことを行う必要がありました。

 public float convertX(float x){ 
     return x* scale * widthProportion;
 } 


 public float convertY(float y){ 
     return y* scale * heightProportion;
 } 

//calculate the positions applying the scale and the proportion
draw_x = convertX((float) (19));
draw_y = convertY((float) (279));
//draw the bitmap with the scaled position
canvas.drawBitmap(toDrawBitmap, draw_x, draw_y, null);

簡単に言うと、ドローアブルを適切に配置するために、デバイスで目的の位置を手動で設定し、密度間のスケールと、背景画像サイズと画面サイズ間の比率を計算しました。ドローアブルのサイズを変更するには、アンドロイドが自動的に密度スケールを適用するため、比率を使用しました。

いくつかの異なる携帯電話とタブレットでテストしましたが、このアプローチは携帯電話で完全に機能します。タブレットでは、ドローアブルのサイズ変更でいくつかの小さな間違いが発生します。

最後に、私の質問は、このソリューションの問題は何ですか? サイズに関係なく、すべての電話で動作させることはできますか、それともより良い解決策がありますか?

これはキャンバスに厳密であることに注意してください。XML レイアウトで使用すると、同じ背景がすべての電話で正しくサイズ変更されます。よくわからなかったり、もっと情報を提供する必要がある場合は、お知らせください。

4

1 に答える 1

0

この問題を解決する前に最初に知っておくべきことは、システムを実行しているデバイスの電話についてです。電話がhdpiまたは他のバージョンのいずれかを選択することをお勧めしますが、それはシステムを実行している各電話に依存します.

A. サイズ合わせの問題

問題は、ビットマップをどのように処理するかです。数式を使用してビットマップを再スケーリングしても、元のビットマップのサイズは、電話ごとに異なる出力になります。これを解決するには、ビットマップの inScaled を false に設定する必要があります。

B. 位置合わせの問題

したがって、ビットマップのサイズを合わせる際に問題が発生します。ビットマップの位置は、携帯電話の画面サイズに応じて位置を同期します。背景オブジェクトを定義し、背景に基づいてオブジェクト x と y を配置する必要があります。たとえば、使用する電話に関係なく電話画面の中央にオブジェクトを配置する場合、コードは `

canvas.drawBitmap(toDrawBitmap, background.getwidth()/2, background.getheight()/2, null);

フィッティング位置の問題を解決します。

何が起こるか教えてください。

于 2017-09-16T05:44:08.943 に答える