实现代码:

package com.android.imooc.gallery;import java.lang.ref.SoftReference;
import java.util.Hashtable;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader.TileMode;
import android.support.v4.util.LruCache;
import android.util.Log;import com.android.imooc.R;/*** @描述 图片处理工具* @项目名称 App_imooc* @包名 com.android.imooc.gallery* @类名 ImageUtil* @author chenlin* @date 2012年9月5日 下午10:05:38* @version 1.0*/public class ImageUtil {private static final String TAG = "ImageUtil";// --方式1 lrucache-------------------------------------------------private static LruCache<Integer, Bitmap> mCache;static {if (mCache == null) {// 最大使用的内存空间int maxSize = (int) (Runtime.getRuntime().freeMemory() / 4);mCache = new LruCache<Integer, Bitmap>(maxSize) {@Overrideprotected int sizeOf(Integer key, Bitmap value) {return value.getRowBytes() * value.getHeight();}};}}/*** 使用softmap获取缓存图片* * @param context* @param resId* @return*/public static Bitmap getBitmapByLruCache(Context context, int resId) {Bitmap bitmap = mCache.get(resId);if (bitmap != null) {return bitmap;}bitmap = getReverseBitmapById(context, resId);mCache.put(resId, bitmap);return bitmap;}// --方式2 SoftMap-------------------------------------------------private static SoftMap<Integer, Bitmap> map = new SoftMap<Integer, Bitmap>();/*** 使用softmap获取缓存图片* * @param context* @param resId* @return*/public static Bitmap getBitmapBySoftCache(Context context, int resId) {Bitmap bitmap = map.get(resId);if (bitmap != null) {return bitmap;}bitmap = getReverseBitmapById(context, resId);map.put(resId, bitmap);return bitmap;}// ---方式3--------------------------------// 缓存集合private static Hashtable<Integer, SoftReference<Bitmap>> mCacheHashTable = new Hashtable<Integer, SoftReference<Bitmap>>();/*** 根据id返回一个处理后的图片* * @param res* @param imageID* @return*/public static Bitmap getImageBitmap(Context context, int imageID) {// 先去集合中取当前imageID 是否已经拿过图片, 如果集合中有, 说明已经拿过, 直接使用集合中的图片返回SoftReference<Bitmap> softReference = mCacheHashTable.get(imageID);if (softReference != null) {Bitmap bitmap = softReference.get();if (bitmap != null) {// 从内存中取Log.i(TAG, "从内存中取");return bitmap;}}// 如果集合中没有, 就调用getInvertImage得到一个图片, 需要向集合中保留一张, 最后返回当前图片Log.i(TAG, "重新加载");Bitmap invertImage = getReverseBitmapById(context, imageID);// 在集合中存一份, 便于下次再取的时候直接去集合中取.mCacheHashTable.put(imageID, new SoftReference<Bitmap>(invertImage));return invertImage;}/*** 根据图片id获得有倒影的图片* * @param resId* @return*/public static Bitmap getReverseBitmapById(Context context, int resId) {int padding = context.getResources().getDimensionPixelOffset(R.dimen.image_paddding);// 图片的间距// 绘制原图Bitmap sourceBitmap = BitmapFactory.decodeResource(context.getResources(), resId);// 图片的默认矩阵// float[] values = {// 1.0f, 0f, 0f,// 0f, 1.0f, 0f,// 0f, 0f, 1.0f// };// 绘制原图的下一半图片Matrix matrix = new Matrix();matrix.setScale(1, -1);// matrix.setValues(values);Bitmap inverseBitmap = Bitmap.createBitmap(sourceBitmap, 0, sourceBitmap.getHeight() / 2,sourceBitmap.getWidth(), sourceBitmap.getHeight() / 2, matrix, false);// 合成图片Bitmap groupbBitmap = Bitmap.createBitmap(sourceBitmap.getWidth(),sourceBitmap.getHeight() + sourceBitmap.getHeight() / 2 + padding, sourceBitmap.getConfig());Canvas gCanvas = new Canvas(groupbBitmap);// 把原图画在合成图片的上面gCanvas.drawBitmap(sourceBitmap, 0, 0, null);// 以图片的左上角与坐标gCanvas.drawBitmap(inverseBitmap, 0, sourceBitmap.getHeight() + padding, null);// 添加遮罩Paint paint = new Paint();TileMode tile = TileMode.CLAMP;LinearGradient shader = new LinearGradient(0, sourceBitmap.getHeight() + padding, 0, groupbBitmap.getHeight(),0x70ffffff, Color.TRANSPARENT, tile);paint.setShader(shader);paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));gCanvas.drawRect(0, sourceBitmap.getHeight() + padding, sourceBitmap.getWidth(), groupbBitmap.getHeight(),paint);return groupbBitmap;}}

softmap代码:

package com.android.imooc.gallery;import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.HashMap;/*** 软引用的map集合* * @author chenlin* * @param <K>* @param <V>*/
public class SoftMap<K, V> extends HashMap<K, V> {// 降低对象的引用界别——V/*** */private static final long serialVersionUID = 1L;private HashMap<K, SoftValue<K, V>> temp;// 存放袋子的集合private ReferenceQueue<V> queue;public SoftMap() {// Object v=new Object();//占用内存较多// SoftReference sr=new SoftReference(v);//v的引用级别被降低了// 第一步:将占用内存较多的手机,添加到袋子中// 第二步:手机被GC回收,清理空袋子temp = new HashMap<K, SoftValue<K, V>>();queue = new ReferenceQueue<V>();// 但凡装V的袋子,都可以放到该集合中}@Overridepublic V put(K key, V value) {// SoftReference<V> sr = new SoftReference<V>(value);// 将手机装到袋子中// SoftReference(T referent, ReferenceQueue<? super T> q)// 记录回收掉的袋子引用ReferenceQueueSoftValue<K, V> sr = new SoftValue<K, V>(key, value, queue);temp.put(key, sr);return null;}@Overridepublic V get(Object key) {clearDatas();SoftValue<K, V> sr = temp.get(key);if (sr != null) {// 垃圾回收器清除,则此方法将返回 null。return sr.get();}return null;}@Overridepublic boolean containsKey(Object key) {// 什么叫真正的contain// temp.containsKey(key);/** if(get(key)!=null) { return true; }else{ return false; }*/return get(key) != null;}/*** 清理空袋子*/@SuppressWarnings("unchecked")private void clearDatas() {// 方式一:循环temp,逐一判断是否有手机,存在问题:如果当前内存够用,循环无用// 方式二:GC知道把那个袋子的手机给回收了,利用GC,让其记录曾经被偷的手机(存入到集合中)// 如果能够控制该集合,再循环该集合,里面存放的一定被回收了// 轮询此队列,查看是否存在可用的引用对象。// 如果存在一个立即可用的对象,则从该队列中"移除"此对象并返回。// 否则此方法立即返回 null。SoftValue<K, V> poll = (SoftValue<K, V>) queue.poll();while (poll != null) {temp.remove(poll.key);poll = (SoftValue<K, V>) queue.poll();}}/*** 增强版的袋子,增加了key,方便清理操作* * @author Administrator* * @param <K>* @param <V>*/@SuppressWarnings("hiding")private class SoftValue<K, V> extends SoftReference<V> {private Object key;public SoftValue(K key, V r, ReferenceQueue<? super V> q) {super(r, q);this.key = key;}}
}

Android 使用三种方式缓存加载 倒影图片相关推荐

  1. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比 标签: AndroidAsyncTaskThreadPool异步加载view 2 ...

  2. Android之Android Studio三种方式导入外部资源 以及 报错处理

    Android Studio三种方式导入外部资源 以及 报错处理 android studio提供了三种方式导入外部资源: 1. Library dependency – 在线添加.需联网下载 . 2 ...

  3. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  4. 剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)

    之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败.为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了 ...

  5. android picasso 显示本地图片,剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)...

    之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败.为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了 ...

  6. Android 系统(167)----Glide加载圆角图片的方法

    Glide加载圆角图片的方法 现在在市面上很多App的UI设计都会出现圆角图片的显示.Glide本身也提供了圆角图片的加载方式.但是我们在开发中有可能遇到只要顶部展示圆角,或者某一个角是圆角.这样的需 ...

  7. 用python的五种方式_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  8. 百度地图测加载的两种 方式 直接加载和异步加载

    1.直接加载 <html> <head><meta http-equiv="Content-Type" content="text/html ...

  9. android 自动表单提交数据,Android 使用三种方式获取网页(通过Post,Get进行表单的提交)...

    // 直接获取信息 void DirectInfo() throws IOException { URL url = new URL(SRC); HttpURLConnection httpConn ...

最新文章

  1. 如何通过结构化智能体完成物理构造任务?| 技术头条
  2. mysql单用户赋予多库权限
  3. matlab clabel函数用法,CLabel函数说明
  4. MFC为什么要保留原来的CPen, 然后SelectObject
  5. 美团 iOS 工程 zsource 命令背后的那些事儿
  6. error_reporting()函数
  7. 设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns)...
  8. 0002-标题段落-前端学习笔记
  9. linux PATH环境变量设置及查看
  10. 影视剧中的歌曲怎么录制 怎么录背景音乐
  11. MySQL DELETE语句和TRUNCATE TABLE语句的区别
  12. DOS命令批量更改文件名称(含空格等)
  13. 台灯c语言,Jya无线台灯C 告诉你如何重新定义光的含义
  14. Android 使用高德SDK编写周边搜索定位
  15. 鸿蒙操作系统全面屏,首发鸿蒙操作系统!华为P50 Pro稳了:居中开孔全面屏
  16. 2019年1月22日 总结
  17. 利用jdk使用WebService
  18. 《三国志·战略版》爆火,友盟+助力手游实现高效促活
  19. 自平衡自行车本质就是一个惯性飞轮,本质就是一样的!!!
  20. 国科大《自然语言处理》复习(宗成庆老师)

热门文章

  1. JMeter参数大小写转换
  2. 安装RabbitMQ出现Plugin configuration unchanged.问题
  3. 微信浏览器内打开App Store链接,并跳转到App指定安装页面
  4. java testsuite,JUnit之TestCase和TestSuite详解
  5. android+锁屏录像,快速录像机(锁屏录像)
  6. MySQL服务器地址为空,win10 mysql没有服务器地址
  7. geogebra画一段椭圆
  8. 使用python实现对图片的高斯模糊
  9. Nordic nRF52832申报要素
  10. php仿maka,iH5和MAKA哪个好?