同步显示有网络图片的List

更新方法啦

现在通过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一并共享,希望对大家有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值