package com.duguang.baseanimation.utils;
import java.lang.ref.SoftReference;
import java.util.Hashtable;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.Shader.TileMode;
import android.util.Log;
public class ImageUtils {
// 存储图片的集合(存在内存中)
private static Hashtable<Integer, SoftReference<Bitmap>>
mCacheBitmapTable = new Hashtable<Integer, SoftReference<Bitmap>>();
/**
* 根据id获得bitmap对象, 注意: 采用了SoftReference缓存,
* @param context
* @param imageID
* @return 先去集合中根据imageID去取相对应的图片,
* 如果有, 直接返回
* 如果没有, 调用getInvertImage方法得到一个对象返回
*/
public static Bitmap getBitmap(Context context, int imageID, int position) {
SoftReference<Bitmap> softReference = mCacheBitmapTable.get(imageID);
if(softReference != null) {
Bitmap bitmap = softReference.get();
if(bitmap != null) {
Log.i("ImageUtils", "从内存中取: " + position);
return bitmap;
}
}
Log.i("ImageUtils", "重新加载: " + position);
Bitmap invertImage = getInvertImage(context, imageID);
// 取出来对应的图片之后, 往内存中存一份, 为了方便下次直接去内存中取
mCacheBitmapTable.put(imageID, new SoftReference<Bitmap>(invertImage));
return invertImage;
}
/**
* 根据给定的id获取处理(倒影, 倒影渐变)过的bitmap
* @param imageID
* @return
*/
private static Bitmap getInvertImage(Context context, int imageID) {
// 获得原图
Options opts = new Options();
opts.inSampleSize = 2;
Bitmap sourceBitmap = BitmapFactory.decodeResource(context.getResources(), imageID, opts);
// 倒影图片
Matrix matrix = new Matrix();
// 设置图片的反转为, 垂直反转
matrix.setScale(1.0f, -1.0f);
// float[] values = {
// 1.0f, 0f, 0f,
// 0f, -1.0f, 0f,
// 0f, 0f, 1.0f
// };
// 倒影图片
Bitmap invertBitmap = Bitmap.createBitmap(sourceBitmap, 0, sourceBitmap.getHeight() /2,
sourceBitmap.getWidth(), sourceBitmap.getHeight() /2, matrix, false);
// 合成一张图片
Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap.getWidth(),
(int) (sourceBitmap.getHeight() * 1.5 + 5), Config.ARGB_8888);
// 把原图添加到合成图片的左上角
Canvas canvas = new Canvas(resultBitmap); // 指定画板画在合成图片上
canvas.drawBitmap(sourceBitmap, 0, 0, null); // 把原图绘制到合成图上
// 把倒影图片绘制到合成图片上
canvas.drawBitmap(invertBitmap, 0, sourceBitmap.getHeight() + 5, null);
Rect rect = new Rect(0, sourceBitmap.getHeight() + 5, resultBitmap.getWidth(), resultBitmap.getHeight());
Paint paint = new Paint();
/**
* TileMode.CLAMP 指定渲染边界以外的控件以最后的那个颜色继续往下渲染
*/
LinearGradient shader = new LinearGradient(0,
sourceBitmap.getHeight() + 5, 0, resultBitmap.getHeight(), 0x70FFFFFF, 0x00FFFFFF, TileMode.CLAMP);
// 设置为取交集模式
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// 指定渲染器为线性渲染器
paint.setShader(shader);
canvas.drawRect(rect, paint);
return resultBitmap;
}
}