3

このコードで画像をダウンロードします:

ImageGetter imageGetter = new ImageGetter() {
    @Override
    public Drawable getDrawable(String source) {
        Drawable drawable = null;
        try {
            URL url = new URL(source);
            String path = Environment.getExternalStorageDirectory().getPath()+"/Android/data/com.my.pkg/"+url.getFile();
            File f=new File(path);
            if(!f.exists()) {
                URLConnection connection = url.openConnection();
                InputStream is = connection.getInputStream();

                f=new File(f.getParent());
                f.mkdirs();                 

                FileOutputStream os = new FileOutputStream(path);
                byte[] buffer = new byte[4096];
                int length;
                while ((length = is.read(buffer)) > 0) {
                    os.write(buffer, 0, length);
                }
                os.close();
                is.close();
            }
            drawable = Drawable.createFromPath(path);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Throwable t) {
            t.printStackTrace();
        }
        if(drawable != null) {
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        }
        return drawable;
    }
};

この画像のサイズは 20x20 です。しかし、drawable.getIntrinsicWidth() と drawable.getIntrinsicHeight() は 27 を返します。画像は大きく見えます。どうすれば修正できますか?

4

2 に答える 2

7

回答からコードを試しましたが、うまくいきませんでした。代わりに、以下のコードを使用しましたが、うまくいきました。

     DisplayMetrics dm = context.getResources().getDisplayMetrics();

     Options options=new Options();
     options.inDensity=dm.densityDpi;
     options.inScreenDensity=dm.densityDpi;
     options.inTargetDensity=dm.densityDpi;      

     Bitmap bmp = BitmapFactory.decodeFile(path,options);
     drawable = new BitmapDrawable(bmp, context.getResources());
于 2013-05-13T18:01:55.113 に答える
6

BitmapDrawable は、さまざまな画面密度を補正するためにビットマップをスケーリングする必要があります。

ピクセルごとに描画する必要がある場合は、Drawable のソース密度とターゲット密度を同じ値に設定してみてください。これを行うには、少し異なるオブジェクトを操作する必要があります。

それ以外の

drawable = Drawable.createFromPath(path);

使用する

Bitmap bmp = BitmapFactory.decodeFile(path);
DisplayMetrics dm = context.getResources().getDisplayMetrics();
bmp.setDensity(dm.densityDpi);
drawable = new BitmapDrawable(bmp, context.getResources());

コンテキストがない場合 (あるべきです)、アプリケーション コンテキストを使用できます。たとえば、どこでもアプリケーション コンテキストを使用していますか?

ビットマップの密度は、実際のデバイスの画面の密度であるリソースの密度に設定されているため、スケーリングせずに描画する必要があります。

于 2012-10-22T15:45:07.433 に答える