1

800 x 300 の画像があります。これは、テスト プラットフォームの解像度 (800x480 の HTC Desire) の幅です。この画像を画面に描画しようとすると、奇妙にスケーリングされます。画面の左側にこぼれ、垂直方向のほぼすべてを埋め尽くします。

私は次のようなコードを使用しています:

canvas.drawBitmap( screen[1], new Rect(0,0,800,300), new Rect(0,0,800,300), null);

何らかの理由で

width_x = canvas.getWidth();

width_y = canvas.getHeight();

私の解像度は533 x 320と報告されています。これは、Androidが使用する魅力的なスケーリングシステムの罵倒削除のためであると想定しているため、アプリはすべての電話で同じサイズに表示されますが、これは無視したいと思います. 私はゲームを書いているので、スケーリングとポジショニングを自分で処理したいと考えています。たとえば、利用可能になった場合により多くの画面領域を使用します。Android のベストプラクティスはアイコンベースのアプリケーションに適しているかもしれませんが、絶対ピクセル位置に描画し、画面の絶対解像度情報を取得したいと考えています。

したがって、私の質問はこれです-これは絶対に不可能ですか? Androidにはこれを行うためのシンプルで効果的なシステムがあるため、完全に禁忌である場合、それが何であるかを知りたい. dpi は私のゲーム デザインには関係ありません (これが PC ゲームの場合と同様に、関係ありません)

何らかの方法で解像度を指定しない限り、おそらく私の画面は実際には 533 x 320 でしょうか? 幅と高さのスケーリング値を使用してみましたが、画像は画面上で大まかに正しいサイズでしたが、何らかのスケーリングが発生したため、エッジがギザギザになりました。したがって、画面が表示できるすべてのピクセルにアクセスできませんでした。

それをスケーリングするために、私は次のようなものを使用しました

canvas.drawBitmap( screen[1], new Rect(0,0,800,300), new Rect((int)(0.0f),(int)(0.0f),(int)(533.0f),(int)(187.5f) ))、 ヌル); // テストのために打ち込んだ数値 - 報告された画面解像度と同等の比率。恐ろしく見える

どんな助けでも大歓迎です。

乾杯、

ロビン。

4

2 に答える 2

0

御返答いただき有難うございます。問題の1つを修正しました-マニフェストファイルで、ターゲットにしているOSが正しく設定されていませんでした-それを4(つまり、1.6)に切り替えると、少なくともHTCでは高さと幅の値が修正されたようです。エミュレーターはもっと問題がありますが、少なくとも正しい方向への大きな一歩です。参考までに、私はフルスクリーンのランドスケープモード(固定)で作業しており、ほとんどすべての機能がオーバーライドされています。(onDraw、surfaceChangedなどを含む)

絶対的な幅と高さを取得できれば、正しいアセットをロードし、画面の配置に正しいスケーリングを使用するための独自のコードを記述できます。dpiは問題ではないので、提案されたガイドラインから大きく外れないことを願っています。

速度を上げるためにビットマップに描画するためのヒントもありがとうございます。これは非常に便利な情報です。あなたはたまたまそのためのコマンドを知っていますか?データを別のビットマップに送信するためのオーバーロードがあるcanvas.drawBitmapに気づきませんでした。

あなたの親切な助け、そしてもちろん、ハッピークリスマスに感謝します!(またはあなたの個人的な選択の宗教的/世俗的な休日)

乾杯、

ロビン。

于 2010-12-24T10:31:29.133 に答える
0

Android は、知覚される解像度を台無しにすることは何もしていません。その Desire で 800x480 ピクセルを使用しています。

フルスクリーンのカスタム ビューで作業し、onDraw をオーバーライドしていますか? SurfaceView を使用していますか? 問題を解決する前に、これらのことを知っておく必要があります。

上記を実行していると仮定すると、 Canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)を使用して、スケーリングなしでビットマップを画面に描画できるはずです。canvas.drawBitmap( screen[1], 0.0f, 0.0f, null);あなたの場合、キャンバスの左上隅に配置するように見えます。

パフォーマンスに敏感なアプリ (ゲームなど) では、描画ループ中に drawBitmap() のソース/宛先 Rect バージョンを使用したくありません。これは、ループの反復ごとにスケーリングを行うためです。代わりに、元のビットマップのスケーリング/トリミングされたバージョンを別のメンバー ビットマップに描画し、上記のリンクの drawBitmap の x/y オフセット バージョンを使用してループ内で描画します。

作業している画面の領域の量を知りたい場合 (カスタム描画を行っている場合は、必ず確認する必要があります) 、実装に応じてonSizeChanged()またはsurfaceChanged()のいずれかをオーバーライドする必要があります。 .

API demosを実際に確認する必要があります。そこには、まさにあなたがやろうとしていることを実行する方法の素晴らしい例がいくつかあります。

幸運を!

于 2010-12-23T16:00:54.653 に答える