Java NetworkImageView从文件中设置图像
我有一个Java NetworkImageView从文件中设置图像,java,android,image,networkimageview,Java,Android,Image,Networkimageview,我有一个NetworkImageView,它从URL加载内容,但在特定情况下,我还希望能够从用户的图库加载图像(甚至用相机拍摄图像) 我正在使用从图库加载图像,选择后,它允许我获取图像的文件路径。此路径类似于/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg 如果我尝试直接从此路径加载图像,Volley将引发一个异常,说明: NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:错误的U
NetworkImageView
,它从URL加载内容,但在特定情况下,我还希望能够从用户的图库加载图像(甚至用相机拍摄图像)
我正在使用从图库加载图像,选择后,它允许我获取图像的文件路径。此路径类似于/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg
如果我尝试直接从此路径加载图像,Volley将引发一个异常,说明:
NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:错误的URL/mnt/sdcard/bimagechooser/IMG\u 20140811\u 155007906.jpg
我还尝试设置可拉伸:
Drawable newImage = Drawable.createFromPath(imagePath);
mNetworkImageView.setImageDrawable(newImage);
运行这些行时不会发生任何情况,视图保持为空/不变
设置无URL的
网络图像视图内容的正确方法是什么?我不确定,但值得尝试:
当您为您的mImageLoader创建内存缓存时,请将其保留在某个位置,现在为您的mImageLoader创建缓存密钥
按此代码生成的图像:
private static String getCacheKey(String url, int maxWidth, int maxHeight) {
return new StringBuilder(url.length() + 12).append("#W").append(maxWidth)
.append("#H").append(maxHeight).append(url).toString();
}
之后,通过调用以下命令将图像放入缓存:
mCache.putBitmap(cacheKey, response);
然后再次将您的url发送到NetworkImageView,Volley将在其缓存中找到您的url并将其返回给您
我希望有帮助 我不确定,但值得一试:
当您为您的mImageLoader创建内存缓存时,请将其保留在某个位置,现在为您的mImageLoader创建缓存密钥
按此代码生成的图像:
private static String getCacheKey(String url, int maxWidth, int maxHeight) {
return new StringBuilder(url.length() + 12).append("#W").append(maxWidth)
.append("#H").append(maxHeight).append(url).toString();
}
之后,通过调用以下命令将图像放入缓存:
mCache.putBitmap(cacheKey, response);
然后再次将您的url发送到NetworkImageView,Volley将在其缓存中找到您的url并将其返回给您
我希望有帮助 setImageDrawable
不起作用的原因是因为在onLayout
和setImageUrl
中调用私有方法LoadImageIfEssential
,如果没有提供图像url,该方法将调用另一个私有方法setDefaultImageOrNull
。这将清除通过setImageDrawable
设置的任何内容
截击的NetworkImageView代码
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
loadImageIfNecessary(true);
}
void loadImageIfNecessary(final boolean isInLayoutPass) {
...
// if the URL to be loaded in this view is empty, cancel any old requests and clear the
// currently loaded image.
if (TextUtils.isEmpty(mUrl)) {
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
setDefaultImageOrNull();
return;
}
...
}
private void setDefaultImageOrNull() {
if(mDefaultImageId != 0) {
setImageResource(mDefaultImageId);
}
else {
setImageBitmap(null);
}
}
您可以按照@mmloolo的建议手动将您的图像添加到图像缓存中,也可以根据截图创建您自己的“NetworkImageView”,并在没有提供url的情况下让onLayout
不调用LoadImageIfEssential
。然后,您可以覆盖ImageView setterssetImageDrawable
和setImageURI
以将url设置为空。然后,您可以像通常使用ImageView一样使用setImageDrawable和setImageURI
注意:如果覆盖setImageBitmap
或setImageResource
方法,则可能会遇到问题,因为这些方法在loadimageifneeded
中调用。我还没有遇到问题,但是我没有做太多的测试
你们班
public class MyNetworkImageView extends ImageView {
//Copy the code from Volley's NetworkImageView and change onLayout as below.
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!TextUtils.isEmpty(mUrl)) {
loadImageIfNecessary(true);
}else{
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
}
}
//Change the other ImageView image setters, for example...
@Override
public void setImageDrawable(Drawable drawable) {
mUrl = null;
super.setImageDrawable(drawable);
}
@Override
public void setImageURI(Uri uri) {
mUrl = null;
super.setImageURI(uri);
}
}
setImageDrawable
不起作用的原因是,在onLayout
和setImageUrl
中调用私有方法LoadImageIfEssential
,如果没有提供图像url,该方法将调用另一个私有方法setDefaultImageOrNull
。这将清除通过setImageDrawable
设置的任何内容
截击的NetworkImageView代码
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
loadImageIfNecessary(true);
}
void loadImageIfNecessary(final boolean isInLayoutPass) {
...
// if the URL to be loaded in this view is empty, cancel any old requests and clear the
// currently loaded image.
if (TextUtils.isEmpty(mUrl)) {
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
setDefaultImageOrNull();
return;
}
...
}
private void setDefaultImageOrNull() {
if(mDefaultImageId != 0) {
setImageResource(mDefaultImageId);
}
else {
setImageBitmap(null);
}
}
您可以按照@mmloolo的建议手动将您的图像添加到图像缓存中,也可以根据截图创建您自己的“NetworkImageView”,并在没有提供url的情况下让onLayout
不调用LoadImageIfEssential
。然后,您可以覆盖ImageView setterssetImageDrawable
和setImageURI
以将url设置为空。然后,您可以像通常使用ImageView一样使用setImageDrawable和setImageURI
注意:如果覆盖setImageBitmap
或setImageResource
方法,则可能会遇到问题,因为这些方法在loadimageifneeded
中调用。我还没有遇到问题,但是我没有做太多的测试
你们班
public class MyNetworkImageView extends ImageView {
//Copy the code from Volley's NetworkImageView and change onLayout as below.
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!TextUtils.isEmpty(mUrl)) {
loadImageIfNecessary(true);
}else{
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
}
}
//Change the other ImageView image setters, for example...
@Override
public void setImageDrawable(Drawable drawable) {
mUrl = null;
super.setImageDrawable(drawable);
}
@Override
public void setImageURI(Uri uri) {
mUrl = null;
super.setImageURI(uri);
}
}
你还认为这是可能的吗?请显示适当的文档。好吧,至少setImageDrawable
应该可以工作,因为该类扩展了ImageView
,我现在看到它来自Volley库(您可能已经提到了),并且确实扩展了ImageView。因此,您可以使用ImageView执行所有可能的操作。位图myBitmap=BitmapFactory.decodeFile(imgFile.getAbsolutePath());ImageView ImageView=(ImageView)findViewById(R.id.ImageView);设置图像位图(myBitmap);这是我的想法,但显然它不起作用。正确,它不起作用,请参阅下面我的答案以获取信息。你仍然认为这是可能的吗?请显示适当的文档。好吧,至少setImageDrawable
应该可以工作,因为该类扩展了ImageView
,我现在看到它来自Volley库(您可能已经提到了),并且确实扩展了ImageView。因此,您可以使用ImageView执行所有可能的操作。位图myBitmap=BitmapFactory.decodeFile(imgFile.getAbsolutePath());ImageView ImageView=(ImageView)findViewById(R.id.ImageView);设置图像位图(myBitmap);这是我的想法,但显然它不起作用。正确,它不起作用,请参阅下面的答案以获取信息。url
param是文件路径?我认为这不会产生任何问题,因为您已经将位图放入他的缓存中,他永远不会提出任何网络请求,首先,他查看他的缓存,如果他找到了图像,他就会得到它,仅此而已。我仍然不知道我应该使用什么URL,如何/何时将图像添加到缓存中。在调用NetworkImage(setImgURL,mImageLoader)之前,任何假URL都会起作用;在getView中,您必须将drables放在他的缓存中,然后用setImgURL替换该行的伪url。您尝试过我的解决方案吗?url
param是文件路径?我认为这不会产生任何问题,因为您已经将位图放在他的缓存中,他永远不会提出任何网络请求,首先他会查看他的cac