4

私のアプリには、 setCompoundDrawablesWithIntrinsicBoundsを使用して設定された画像付きのボタンが含まれています。アプリのdrawablesフォルダーの画像を使用しますが、Web からダウンロードして SD カードに保存した画像も使用します。drawablesの画像と同じサイズでレンダリングされるように、SD カードの画像を拡大する必要があることがわかりました。私はこれを使用してこれを行いました:

    Options opts = new BitmapFactory.Options();

    opts.inDensity = 160;
    Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() +
      context.getResources().getString(R.string.savefolder) + iconfile, opts);

    myIcon = new BitmapDrawable(context.getResources(), bm);
    btn.setCompoundDrawablesWithIntrinsicBounds(myIcon, null, null, null );

携帯電話を Android 4.1.1 にアップデートしたところ、ダウンロードした画像が drawable フォルダーの画像よりもはるかに小さいサイズで表示されるようになるまで、これは問題なく機能していました。

inDensity値をいじってほとんど効果はありませんでしたが、 btnheight値 (画像が置かれているボタンの高さ) に基づいてビットマップをスケーリングすることで、より多くの成功を収めました。

    int intoffset=bm.getHeight() - bm.getWidth();                   
    myIcon = new  BitmapDrawable(context.getResources(), 
      Bitmap.createScaledBitmap(bm, btnheight - (((btnheight/100)*10) +
      intoffset) , btnheight - ((btnheight/100)*10), true));

この種の動作はしますが、画像はそれが置かれているボタンよりも少し大きいです (上記に基づいて、画像の高さをボタンの高さの 90% にスケーリングする必要があるため、そうではありません)。これをテストとして行いました。ボタンに表示されるフォントサイズに応じてボタンの高さが変化し、ユーザーがアプリの設定でこのフォントサイズを変更できるため、アプリでこのメソッドを使用できません。

余談ですが、奇妙なことに(?)、ビットマップを元の高さの 2 倍にスケーリングすることで、

   Bitmap.createScaledBitmap(bm, bm.getWidth() * 2
       , bm.getHeight() * 2, true));

4.0.3 と 4.1.1 では正しくレンダリングされました (ドローアブル アイコンと同じサイズで表示されました) が、2.1 では期待どおりに動作しました (ボタンよりも大きくレンダリングされました)。

4.1.1 でこれが発生する理由と、4.1.1 用に個別にコーディングすることなく、decodeFile ビットマップが描画可能なビットマップと同じサイズでレンダリングされるようにするためにできることについて、誰かが洞察を持っている場合は、大歓迎です!

4

1 に答える 1

7

元のコードを次のように変更すると、4.1.1 と、テストした以前のバージョンで動作します...

   Options opts = new BitmapFactory.Options();

   DisplayMetrics dm = new DisplayMetrics();
   context.getWindowManager().getDefaultDisplay().getMetrics(dm);

    int dpiClassification = dm.densityDpi;

    opts.inDensity = dm.DENSITY_MEDIUM;

    opts.inTargetDensity = dpiClassification;
    opts.inScaled =true;

    Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() +
     context.getResources().getString(R.string.savefolder) + iconfile, opts);

    myIcon = new BitmapDrawable(context.getResources(), bm);
    btn.setCompoundDrawablesWithIntrinsicBounds(myIcon, null, null, null ); 
于 2013-01-22T16:17:20.263 に答える