6

NetworkImageView 用来显示从远程 URL 下载的一些封面,并且我成功地设法缓存并显示它们,但我想让用户根据需要设置自己的封面图像。我尝试使用setImageUrl带有Uri.fromFile(mCoverFile).toString()作为参数的方法,但它不起作用。由于它是远程和本地图像的混合,我无法切换到常规ImageViews,所以我想知道是否有任何方法可以加载本地图像。

我当然知道ImageView's 的setImageBitmap方法,但是会NetworkImageView自动调整创建的大小Bitmap并防止在s 和sView中回收。GridViewListView

更新: njzk2的回答成功了。要根据您的大小自动调整位图的大小,只需从 Volley 的源代码中View复制该方法即可。ImageRequest.doParse

4

3 回答 3

7

NetworkImageView使用ImageLoader,而后者又使用ImageCache.

您可以为ImageCache您的图像提供自定义,前提是您使用相同的密钥机制:

 return new StringBuilder(url.length() + 12).append("#W").append(maxWidth)
            .append("#H").append(maxHeight).append(url).toString();

url在实际请求完成之前没有经过测试,所以这里没有问题。

通常,您的“缓存”可能如下所示:

public class MyCache implements ImageLoader.ImageCache {

    @Override
    public Bitmap getBitmap(String key) {
        if (key.contains("file://")) {
            return BitmapFactory.decodeFile(key.substring(key.indexOf("file://") + 7));
        } else {
            // Here you can add an actual cache
            return null;
        }
    }
    @Override
    public void putBitmap(String key, Bitmap bitmap) {
        // Here you can add an actual cache
    }
}

你像这样使用它:

imageView.setImageUrl(Uri.fromFile(mCoverFile).toString(), new MyCache());

(这还没有实际测试,可能会有一些调整)

于 2014-03-17T20:59:24.693 回答
1

谢谢您的回答。我根据您的帮助编写了一些代码。

用法:只需使用 LocalImageCache.class 作为缓存。无需更改代码。

private ImageLoader mLocalImageLoader;

mLocalImageLoader = new ImageLoader(mRequestQueue,
            new LocalImageCache(mCtx));

NetworkImageView test = (NetworkImageView) findViewById(R.id.iv_test);  

test.setImageUrl("/storage/emulated/0/DCIM/Philm/2017_03_24_01_.png", MySingleton.getInstance(this.getApplicationContext()).getLocalImageLoader());

public class LocalImageCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {

public LocalImageCache(int maxSize) {
    super(maxSize);
}

public LocalImageCache(Context ctx) {
    this(getCacheSize(ctx));
}

@Override
public Bitmap getBitmap(String key) {
    key = key.substring(key.indexOf("/"));
    Bitmap result = get(key);
    Log.d("TAG", key);
    if (result == null) {
        Bitmap temp =  BitmapFactory.decodeFile(key);
        put(key, temp);
        return temp;
    } else {
        return result;
    }
}

@Override
public void putBitmap(String key, Bitmap bitmap) {
    // Here you can add an actual cache
    // Never touch here
}

// 默认屏幕5倍的图片缓存
// Returns a cache size equal to approximately three screens worth of images.
public static int getCacheSize(Context ctx) {
    final DisplayMetrics displayMetrics = ctx.getResources().
            getDisplayMetrics();
    final int screenWidth = displayMetrics.widthPixels;
    final int screenHeight = displayMetrics.heightPixels;
    // 4 bytes per pixel
    final int screenBytes = screenWidth * screenHeight * 4;

    return screenBytes * 5;
}

@Override
protected int sizeOf(String key, Bitmap value) {
    return value.getRowBytes() * value.getHeight();
}

}

于 2017-03-24T04:31:35.667 回答
0

NetworkImageView 扩展了 ImageView。您应该能够使用与常规 ImageView 相同的方法

image.setImageResource(R.drawable.my_image);

或者

imageView.setImageBitmap(BitmapFactory.decodeFile(imagePath)); 
于 2014-03-17T20:39:08.050 回答