我们在开发项目时经常会遇到图片的加载,这样我们就要对图片进行异步加载缓存。网上有很多开源框架,Picasso是Square公司开源的一个Android图形缓存库,可以实现图片下载和缓存。下载地址:http://square.github.io/picasso/,把下好的包加入到你工程的libs里就行了,Picasso使用很简单代码如下:
Picasso.with(context).load("URL").into(imageView);
ImageLoader也是开源的Android图形缓存库,它能对图片显示进行处理如圆角边框,圆形图片等。下载地址:https://github.com/nostra13/Android-Universal-Image-Loader,一样的把下好的包导入项目中去就行了。不做任何处理代码如下:
ImageLoader.getInstance().displayImage(url, ImageView);
把图片变成圆角矩形代码如下:
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_stub) 加载开始默认的图片
.showImageForEmptyUri(R.drawable.ic_empty) //url为空会显示该图片,自己放在drawable里面的
.showImageOnFail(R.drawable.ic_error) //加载图片出现问题,会显示该图片
.cacheInMemory() //缓存用
.cacheOnDisc() //缓存用
.displayer(new RoundedBitmapDisplayer(5)) //图片圆角显示,值为整数
.build();
ImageLoader.getInstance().displayImage(url, imageView,options);
把图片变成圆形代码如下:
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)//缓存
.displayer(new CircleBitmapDisplayer())//圆形类
.build();
ImageLoader.getInstance().displayImage(URL,imageView, options);
圆形类CircleBitmapDisplayer代码如下:
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.core.assist.LoadedFrom;
import com.nostra13.universalimageloader.core.display.BitmapDisplayer;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
public class CircleBitmapDisplayer implements BitmapDisplayer {
protected final int margin ;
public CircleBitmapDisplayer() {
this(0);
}
public CircleBitmapDisplayer(int margin) {
this.margin = margin;
}
@Override
public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom arg2) {
if (!(imageAware instanceof ImageViewAware)) {
throw new IllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");
}
imageAware.setImageDrawable(new CircleDrawable(bitmap, margin));
}
}
这样显示的图片就是圆形了。
图片处理不仅在网络下载图片需要处理,拍照上传、选择本地照片上传,有时候就会对图片进行截取或者把图片变成圆形、圆角矩形显示等。
图片进行截取代码如下:
private void cropImage(Uri uri, int outputX, int outputY) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 3);
intent.putExtra("aspectY", 4);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("return-data", true);
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, CODE_CROP);
}
如果不想要按比例调整宽高就把宽高的比例屏蔽掉,这样就可以单独设置宽高了。
把图片变成圆形和圆角矩形代码如下:
public class Bimp {
/**
*
* @param x
* 图像的宽度
* @param y
* 图像的高度
* @param image
* 源图片
* @param outerRadiusRat
* 圆角的大小
* @return 圆形图片
*/
public static Bitmap createFilletPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
// 根据源文件新建一个darwable对象
@SuppressWarnings("deprecation")
Drawable imageDrawable = new BitmapDrawable(image);
// 新建一个新的输出图片
Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
// 产生一个红色的圆形
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
final Rect rect = new Rect(0, 0, x, y);
final RectF rectF = new RectF(rect);
final float roundPx = x / 2;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.RED);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
// 将源图片绘制到这个圆角矩形上
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
imageDrawable.setBounds(0, 0, x, y);
canvas.saveLayer(rectF, paint, Canvas.ALL_SAVE_FLAG);
imageDrawable.draw(canvas);
canvas.restore();
return output;
}
/**
*
* @param x
* 图像的宽度
* @param y
* 图像的高度
* @param image
* 源图片
* @param outerRadiusRat
* 圆角的大小
* @return 圆角图片
*/
public static Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
// 根据源文件新建一个darwable对象
@SuppressWarnings("deprecation")
Drawable imageDrawable = new BitmapDrawable(image);
// 新建一个新的输出图片
Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
// 新建一个矩形
RectF outerRect = new RectF(0, 0, x, y);
// 产生一个红色的圆角矩形
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint);
// 将源图片绘制到这个圆角矩形上
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
imageDrawable.setBounds(0, 0, x, y);
canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
imageDrawable.draw(canvas);
canvas.restore();
return output;
}
}
然后直接调用方法就ok了。
//mivavatar是ImageView控件
mivavatar.setImageBitmap(Bimp.createFilletPhoto(480, 480,
BitmapFactory.decodeFile(filePath), (int) (dp * 1.6f)));