package com.game.webgame.network;


import com.android.volley.toolbox.ImageLoader.ImageListener;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.util.LruCache;
import android.widget.ImageView;

public class ImageLoader {
	// 导包记得使用v4兼容包会兼容低版本
	/**
	 * 图片缓存核心类(将最近不怎么使用的图片回收;尽量保持最近使用比较多的)
	 */
	private static LruCache<String, Bitmap> mMemoryCache;
	
	private static ImageLoader mImageLoader;

	private ImageLoader() {
		// 获取系统分配给每个应用程序的最大内存，每个应用系统分配32M
		// int maxMemory = (int) Runtime.getRuntime().maxMemory();
		// int mCacheSize = maxMemory / 8;
		// 给LruCache分配1/8 4M
		// maxSize最多缓存多大内存(获得应用程序最大可用内存/8)
		
		 int maxMemory = (int) Runtime.getRuntime().maxMemory();//返回 Java
		// 虚拟机试图使用的最大内存量
		System.out.println("Runtime.getRuntime().maxMemory()=="
				+ Runtime.getRuntime().maxMemory());
		System.out.println("Runtime.getRuntime().freeMemory()=="
				+ Runtime.getRuntime().freeMemory());// kb返回 Java 虚拟机中的空闲内存量
		int maxSize = maxMemory / 8;

		mMemoryCache = new LruCache<String, Bitmap>(maxSize) {
			@Override
			protected int sizeOf(String key, Bitmap bitmap) {
				// 重写此方法来衡量每一张图片的大小，默认返回图片的数量大小
				return bitmap.getRowBytes() * bitmap.getHeight() / 1024;// 这里是按多少KB来算
																		// 之前是B
																		// byte
			}
		};
	}

	// 单例模式，防止mMemoryCache出现多个

	public static ImageLoader getIntance() {
		if (mImageLoader == null) {
			mImageLoader = new ImageLoader();
		}
		return mImageLoader;
	}

	/**
	 * 将一张图片缓存到LruCache中 将图片的路径作为图片缓存的key
	 */
	public void addBitmapToMemoryCache(String path, Bitmap bitmap) {
		if (getBitmapFromMemoryCache(path) == null) {
			mMemoryCache.put(path, bitmap);
		}
	}

	/**
	 * 从LrcCache里面取一张图片 读需要图片的路径作为key
	 */
	public Bitmap getBitmapFromMemoryCache(String path) {
		return mMemoryCache.get(path);
	}

	/**
	 * 图片压缩 读取一个图片文件，通过压缩算法压缩后，生成一个Bitmap返回
	 */
	public static Bitmap decodeBitmapFromResource(String iconPath, int reqWidth) {
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 1.得到原始图片的宽度

		// 不读取图片本身，而是只解析图片的宽高。只是读图片大小，不申请bitmap内存 在decode时将会返回null,
		options.inJustDecodeBounds = true;
		
		BitmapFactory.decodeFile(iconPath, options);
		//BitmapFactory.decodeResource(context.getResources(), id)
		//BitmapFactory.decodeResource(context.getResources(), R.drawable.applogo, options);
		// ByteArrayOutputStream baos = new ByteArrayOutputStream();
		// image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
		// if( baos.toByteArray().length / 1024>1024)
		// {//判断如果图片大于1M,进行压缩避免在生成图片（BitmapFactory.decodeStream）时溢出
		// baos.reset();//重置baos即清空baos
		// image.compress(Bitmap.CompressFormat.JPEG, 50,
		// baos);//这里压缩50%，把压缩后的数据存放到baos中
		// }
		// ByteArrayInputStream isBm = new
		// ByteArrayInputStream(baos.toByteArray());
		// BitmapFactory.decodeStream(is, outPadding, opts);
		int width = options.outWidth;
		int height = options.outHeight;
		int inSampleSize = 1;
		if (width > reqWidth) {
			// 计算出实际宽度和目标宽度的比率
			int widthRatio = Math.round((float) width / (float) reqWidth);
			inSampleSize = widthRatio;
		}
		// 2.压缩后的图片宽度reqWidth
		// 开始压缩图片
		// 读图片本身了//设为false，这次不是预读取图片大小，而是返回申请内存，bitmap数据
		options.inJustDecodeBounds = false;
		// 设置压缩比例（比如：2，宽和高一起压缩1/2）
		options.inSampleSize = inSampleSize;// 倍数缩放
		return BitmapFactory.decodeFile(iconPath, options);
	}
	/**
	 * 图片压缩 读取一个图片文件，通过压缩算法压缩后，生成一个Bitmap返回
	 */
	public static Bitmap decodeBitmapFromResource(Context context,int id, int reqWidth) {
		BitmapFactory.Options options = new BitmapFactory.Options();

		options.inJustDecodeBounds = true;
		BitmapFactory.decodeResource(context.getResources(), id, options);
		int width = options.outWidth;
		int height = options.outHeight;
		int inSampleSize = 1;
		if (width > reqWidth) {
			int widthRatio = Math.round((float) width / (float) reqWidth);
			inSampleSize = widthRatio;
		}
		options.inJustDecodeBounds = false;
		// 设置压缩比例（比如：2，宽和高一起压缩1/2）
		options.inSampleSize = inSampleSize;// 倍数缩放
		return BitmapFactory.decodeResource(context.getResources(), id, options);
	}

	
}
