更新方法啦
现在通过WebView来加载图片,由于WebView会自动从cache中读取已下载过的图片,所以可以有效的复用已有资源,而且不会增加额外的代码。
不过还是有一些小缺陷
1. 必须要在layout中设定图片要显示的大小
2. 有时会看到图片会缩小
以后有机会再改进吧。
自己做了个类,用来同步显示网络图片。
放到List里,好像也能正常工作,截图如下
[img]http://dl.iteye.com/upload/attachment/255365/5df148b5-fd04-3a3f-9ee4-2b20fb1cbbf4.png[/img]
完整sourse一并共享,希望对大家有用。
现在通过WebView来加载图片,由于WebView会自动从cache中读取已下载过的图片,所以可以有效的复用已有资源,而且不会增加额外的代码。
不过还是有一些小缺陷
1. 必须要在layout中设定图片要显示的大小
2. 有时会看到图片会缩小
以后有机会再改进吧。
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.webkit.WebView.PictureListener;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
public class LoadImageSync extends RelativeLayout {
private WebView mWebView;
private ProgressBar mLoading;
private ImageView mImage;
public LoadImageSync(Context context) {
this(context, null);
}
public LoadImageSync(Context context, AttributeSet attrs) {
super(context, attrs);
setupComponent(context);
}
private void setupComponent(Context context) {
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
mLoading = new ProgressBar(context);
mLoading.setLayoutParams(params);
mLoading.setProgress(android.R.attr.progressBarStyleSmall);
mImage = new ImageView(context);
mImage.setLayoutParams(params);
mWebView = new WebView(context);
mWebView.setBackgroundColor(0);
mWebView.setScrollBarStyle(0);
mWebView.setLayoutParams(params);
mWebView.setWebViewClient(new LoadImageWebViewClient());
mWebView.setPictureListener(picListener);
WebSettings webSettings = mWebView.getSettings();
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
removeAllViews();
addView(mLoading);
addView(mWebView);
addView(mImage);
}
public void setImageUrl(String url) {
load(url);
}
private void load(String url) {
new AsyncTask<String, Void, Void>() {
@Override
protected Void doInBackground(String... params) {
String url = params[0];
mWebView.loadDataWithBaseURL(null,
getHtmlContent(url, mWebView), "text/html", "utf-8",
null);
return null;
}
}.execute(url);
}
private String getHtmlContent(String imageUrl, WebView view) {
StringBuffer sb = new StringBuffer();
sb.append("<center>");
sb.append("<img width=\"100%\" src=\"" + imageUrl + "\" />");
sb.append("</center>");
return sb.toString();
}
private class LoadImageWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
mLoading.setVisibility(View.GONE);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
mLoading.setVisibility(View.VISIBLE);
mWebView.setVisibility(View.GONE);
mImage.setVisibility(View.GONE);
}
@Override
public void onPageFinished(WebView view, String url) {
mWebView.setVisibility(View.VISIBLE);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setVerticalScrollBarEnabled(false);
mLoading.setVisibility(View.GONE);
}
}
PictureListener picListener = new PictureListener() {
public void onNewPicture(WebView view, Picture picture) {
Picture pic = mWebView.capturePicture();
int w = pic.getWidth();
int h = pic.getHeight();
Bitmap b = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(b);
view.draw(c);
mWebView.setVisibility(View.GONE);
mImage.setImageBitmap(b);
mImage.setVisibility(View.VISIBLE);
}
};
}
自己做了个类,用来同步显示网络图片。
放到List里,好像也能正常工作,截图如下
[img]http://dl.iteye.com/upload/attachment/255365/5df148b5-fd04-3a3f-9ee4-2b20fb1cbbf4.png[/img]
完整sourse一并共享,希望对大家有用。