前言
安卓开发过程中,很多时候都会用到加载网络图片,而加载这些网络图片往往又很占内存,所以,我们最好对这些图片进行一个监控。比如说,imageView的宽和高为40dp,然后经过转换,大概是120px左右。也就是说,我们加载的图片尺寸,其实只要120px就行了。如果后台返回的图片尺寸是300px*300px,那多出的180px是没有意义的,只会浪费内存和流量。所以,我们在开发的时候,要对图片进行一个监控。
效果图
如果网络图片的尺寸,大于本地imageview设置的尺寸,并且超过一定数值(比如超过100px),就弹框显示,展示这张图片,还有在哪个Activity,图片链接,网络图片和本地imageview的尺寸对比。然后再把这些信息告诉后端,让他们下发尺寸小一点的网络图片。
代码实现
首先是建立一个统一加载图片的方法,这个一般都会有:
/**
* 加载网络图片
*/
public void loadUrlImage(final Activity activity, final String url, final ImageView imageView) {
Glide.with(activity).load(url).into(imageView);
if (isShowDialog) {
checkImgSize(activity, url, imageView);
}
}
然后,就是判断,开发版就开启图片监控:,然后去获取网络图片的尺寸:
/**
* 获取网络图片尺寸
*/
private void checkImgSize(final Activity activity, final String url, final ImageView imageView) {
Glide.with(activity)
.load(url)
.asBitmap()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(final Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
imageView.post(new Runnable() {
@Override
public void run() {
if (resource.getWidth() - imageView.getWidth() > imgSize || resource.getHeight() - imageView.getHeight() > imgSize) {
showDialog(activity, url, resource.getWidth(), resource.getHeight(), imageView.getWidth(), imageView.getHeight());
}
}
});
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
}
});
}
然后根据获取的图片尺寸和本地的进行比较,如果超出了当初设置的值,那就弹框显示:
/**
* 弹框
*/
private void showDialog(Activity activity, final String url, int urlWidth, int urlHeight, int imgWidth, int imgHeight) {
SharedPreferences sp = activity.getSharedPreferences("imgSizeSp", MODE_PRIVATE);
final SharedPreferences.Editor editor = sp.edit();
final String urls = sp.getString("img", "");
if ((dialog == null || (dialog != null && !dialog.isShowing())) && !urls.contains(url)) {
dialog = new Dialog(activity);
View view = LayoutInflater.from(activity).inflate(R.layout.show_img_size_dialog, null);
TextView textView = (TextView) view.findViewById(R.id.tv_content);
ImageView imageView = (ImageView) view.findViewById(R.id.iv_pic);
Button btn_notip = (Button) view.findViewById(R.id.btn_notip);
Button btn_cancel = (Button) view.findViewById(R.id.btn_cancel);
Glide.with(activity).load(url).into(imageView);
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
btn_notip.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editor.putString("img", urls + url).apply();
dialog.dismiss();
}
});
textView.setText(activity.getLocalClassName() + "\n\n" + url + "\n\n" + "图片超出View尺寸\nbitmap:" + urlWidth + " * " + urlHeight + "\nview:" + imgWidth + " * " + imgHeight);
dialog.setContentView(view);
dialog.show();
}
}
总结
思路大概就是这样,代码优化就看人吧。
网友评论