1

アプリの一部で、次を使用して画面密度を確認します。

float sdpi = ApplicationConstants.ref_currentActivity.getResources().getDisplayMetrics().density;
if(sdpi == 0.75)
    {
        ApplicationConstants.screenSize = "small";
    }
    else if(sdpi == 1.0)
    {
        ApplicationConstants.screenSize = "medium";
    }
    else if(sdpi == 1.5)
    {
        //Message.inform("Setting Screen Size", "sdpi is:" + sdpi + " so screen size is large");
        ApplicationConstants.screenSize = "large";
    }
    else if(sdpi == 2.0)
    {
        ApplicationConstants.screenSize = "xlarge";
    }

その後、別の部分で、screenSize に基づいて適切な画像ビットマップをロードするメソッドを単純に作成します。

   if(ApplicationConstants.screenSize.equals("small"))
    {
        imageName = imageName + "s";
    }
    else if(ApplicationConstants.screenSize.equals("medium"))
    {
        imageName = imageName + "m";
    }
    else if (ApplicationConstants.screenSize.equals("large"))
    {
        imageName = imageName + "l";
        //Message.inform("ImageName should have an l at the end", imageName );
    }
    else imageName = imageName + "x";

したがって、基本的に-私がfindImageByName( "SomeImage")を呼び出す場合、画像名は画面密度に基づいてSomeImages(small)、SomeImagem(medium)、SomeImagel(large)、SomeImagex(xlarge)に変更されます-そして、imageNameを使用しますjarファイルから抽出した画像からドローアブルを作成します。

私の mdpi 画面デバイスでは正常に動作することがわかりますが、エミュレータでは本来あるべき場所に画像が表示されません。

どこかでばかげた間違いをしたのではないかと思ったので、sdpiが1.5の場合でもApplicationConstants.screenSizeを「中」に変更しましたが、エミュレーターの実行時に画像が読み込まれません。

誰もこの問題を抱えたことがありますか?

注: この方法で画像をロードする理由は、それがモジュラー ImageLoader クラスであり、jar ファイルから画像をロードするためです。jar ファイルには、 DexClassLoader を使用して実行時に動的にロードする .class に必要な画像が含まれています。動的モジュールのロードのプロセスについて質問がある場合は、お気軽にお問い合わせください。私がこのように画像をロードする理由を説明します。

どんな助けでも大歓迎です:)仲間のStackOverflowers。

注: 現在、hdpi の実生活の Android デバイスにアクセスすることはできません。

編集:

エミュレーターで動作させることができましたが、これは状態を使用していません...ボタンがクリックされているように見えるようにするために、最終的にボタンで使用する必要があります。

機能するものは次のとおりです。

b[i].setBackgroundDrawable(ApplicationConstants.moduleImageLoader.findImageByName(drawable_normal));

そして、これがうまくいかないものです:しかし、そうすべきです!

states.addState(new int[] {}, ApplicationConstants.moduleImageLoader.findImageByName(drawable_normal)); b[i].setBackgroundDrawable(states);

b はボタンの配列です。ApplicationConstants.modularImageLoader は、現在のモジュールの正しい imageLoader を取得します。findImageByName は、「imageName」を取り、画面密度に基づいて s、m、l、x を追加し、その名前に一致するドローアブルを返します (つまり、私のモジュールである jar 内のその名前の画像ファイルです)。ModularImage ローダーは、モジュール ローダーと連携して動作します。対応するモジュールに適切な imageLoader を確実にロードします。

このシナリオで状態が機能しない理由は何ですか? どんな助けでも大歓迎です...状態を間違って使用していますか?

4

2 に答える 2

1

それらがタイプミスでない限り、最も可能性の高い問題は、密度が画面サイズに対応していると想定していると思います。実際には、コード化したものの逆になる可能性が最も高いです (たとえば、密度が高いほど、画面サイズは小さくなります。一般的に)。画面が大きくなるほど、ピクセルがさらに分散され、結果が低くなるからです。密度。もちろん、画面の解像度を上げて補正して高密度にすることもできますが、ほとんどの場合、密度が高いほど、密度が低い画面よりも小さな画面になる可能性が高くなります。

于 2012-10-23T21:08:10.583 に答える
0

たとえば、次のような複数の可能性があると思います。

  • エミュレータでは画像へのパスが異なります
  • エミュレータにイメージが存在しません
  • イメージをロードするのに十分なメモリがありません (サイズを小さくするか、エミュレータごとにメモリ設定を変更してください)
于 2012-10-23T21:07:36.863 に答える