MainActivity
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.example.imageloader.bean.ImageAdapter;
import com.example.imageloader.utils.ImageLoader;
import com.example.imageloader.utils.ImageLoader.Type;
import com.example.imageloader.utils.ImagePopupWindow;
import com.example.imageloader.utils.ImagePopupWindow.OnSelectedListener;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private GridView mGridView;
private List<String> mLists;
private ImageAdapter mImgAdapter;
private RelativeLayout mBottomLy;
private TextView mDirName;
private TextView mDirCount;
private File mCurrentDir;
private int mMaxcount;
private ProgressDialog mPd;
private List<FolderBean> mFolderBeans = new ArrayList<FolderBean>();
private ImagePopupWindow mPopupWindow;
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what== 0x110){
mPd.dismiss();
data2View();
initPopupWindow();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDatas();
initEvent();
}
protected void initPopupWindow() {
mPopupWindow=new ImagePopupWindow(this, mFolderBeans);
mPopupWindow.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
ligthOn();
}
});
mPopupWindow.setPopSelected(new OnSelectedListener() {
@Override
public void onSelected(FolderBean folderBean) {
mCurrentDir=new File(folderBean.getDir());
mLists=Arrays.asList( mCurrentDir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
if(filename.endsWith(".jpg")||filename.endsWith(".jpeg")||filename.endsWith(".png") ){
return true;
}
return false;
}
}));
mImgAdapter=new ImageAdapter(MainActivity.this, mLists, mCurrentDir.getAbsolutePath());
mGridView.setAdapter(mImgAdapter);
mDirCount.setText(mLists.size()+"");
mDirName.setText(folderBean.getName());
mPopupWindow.dismiss();
}
});
}
/**
* 内容区域变亮
*/
protected void ligthOn() {
WindowManager.LayoutParams lp=getWindow().getAttributes();
lp.alpha=1.0f;
getWindow().setAttributes(lp);
}
protected void data2View() {
if(mCurrentDir==null){
Toast.makeText(this, "未扫描到任何图片", Toast.LENGTH_SHORT).show();
return;
}
mLists=Arrays.asList(mCurrentDir.list());
mImgAdapter=new ImageAdapter(this, mLists, mCurrentDir.getAbsolutePath());
mGridView.setAdapter(mImgAdapter);
mDirCount.setText(mMaxcount+"");
mDirName.setText(mCurrentDir.getName());
}
private void initView() {
mGridView = (GridView) findViewById(R.id.gridView);
mBottomLy = (RelativeLayout) findViewById(R.id.rl_bottom);
mDirName = (TextView) findViewById(R.id.id_dir_name);
mDirCount = (TextView) findViewById(R.id.id_dir_count);
}
private void initDatas() {
if (!(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))) {
Toast.makeText(this, "SD卡不可用", Toast.LENGTH_SHORT).show();
return;
}
mPd = ProgressDialog.show(this, null, "正在加载...");
new Thread() {
public void run() {
Uri mImgUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver cr = MainActivity.this.getContentResolver();
Cursor cursor=cr.query(mImgUri, null, MediaStore.Images.Media.MIME_TYPE
+ "= ? or " + MediaStore.Images.Media.MIME_TYPE
+ "= ? ",new String[] { "image/jpeg", "image/png" },
MediaStore.Images.Media.DATE_MODIFIED);
Set<String> mDirPaths=new HashSet<String>();
while(cursor.moveToNext()){
String path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
File parentFile=new File(path).getParentFile();
if(parentFile==null){
continue;
}
String dirPath=parentFile.getAbsolutePath();
FolderBean folderBean=null;
if(mDirPaths.contains(dirPath)){
continue;
}else{
mDirPaths.add(dirPath);
folderBean=new FolderBean();
folderBean.setDir(dirPath);
folderBean.setFirstImagePath(path);
}
if(parentFile.list()==null){
continue;
}
int picSize=parentFile.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
if(filename.endsWith(".jpg")||filename.endsWith(".jpeg")||filename.endsWith(".png") ){
return true;
}
return false;
}
}).length;
folderBean.setCount(picSize);
mFolderBeans.add(folderBean);
if(picSize>mMaxcount){
mMaxcount=picSize;
mCurrentDir=parentFile;
}
}
cursor.close();
handler.sendEmptyMessage(0x110);
};
}.start();
}
private void initEvent() {
mBottomLy.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mPopupWindow.showAsDropDown(mBottomLy, 0, 0);
lightOff();
}
});
}
protected void lightOff() {
WindowManager.LayoutParams lp=getWindow().getAttributes();
lp.alpha=0.3f;
getWindow().setAttributes(lp);
}
}
import java.util.List;
import com.example.imageloader.FolderBean;
import com.example.imageloader.R;
import com.example.imageloader.utils.ImageLoader.Type;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
public class ImagePopupWindow extends PopupWindow {
private int mWidth;
private int mHeight;
private View mConvertView;
private ListView mListView;
private List<FolderBean> mLists;
private OnSelectedListener mOnSelectedListener;
public interface OnSelectedListener{
void onSelected(FolderBean folderBean);
}
public void setPopSelected(OnSelectedListener mOnSelectedListener){
this.mOnSelectedListener=mOnSelectedListener;
}
public ImagePopupWindow(Context context,List<FolderBean> mLists) {
callWidthAndHeight(context);
mConvertView=LayoutInflater.from(context).inflate(R.layout.popup, null);
this.mLists=mLists;
setContentView(mConvertView);
setWidth(mWidth);
setHeight(mHeight);
setFocusable(true);
setTouchable(true);
setOutsideTouchable(true);
setBackgroundDrawable(new BitmapDrawable());
setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_OUTSIDE){
dismiss();
return true;
}
return false;
}
});
initView(context);
initEvent();
}
private void initView(Context context) {
mListView=(ListView) mConvertView.findViewById(R.id.lv) ;
mListView.setAdapter(new ListDieAdapter(context, mLists));
}
private void initEvent() {
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
mOnSelectedListener.onSelected(mLists.get(position));
}
});
}
private void callWidthAndHeight(Context context) {
WindowManager wm=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm=new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
mWidth=dm.widthPixels;
mHeight=(int) (dm.heightPixels*0.7);
}
public class ListDieAdapter extends ArrayAdapter<FolderBean>{
private LayoutInflater mInflater;
public ListDieAdapter(Context context,
List<FolderBean> mLists) {
super(context, 0, mLists);
mInflater=LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=mInflater.inflate(R.layout.popup_item, parent, false);
holder.mImg=(ImageView) convertView.findViewById(R.id.pop_item_iv);
holder.mDirName=(TextView) convertView.findViewById(R.id.pop_item_name);
holder.mDirCount=(TextView) convertView.findViewById(R.id.pop_item_count);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
FolderBean fb=getItem(position);
holder.mImg.setImageResource(R.drawable.ic_launcher);
ImageLoader.getInstance(3,Type.LIFO).loadImage(fb.getFirstImagePath(), holder.mImg);
holder.mDirCount.setText(fb.getCount()+"");
holder.mDirName.setText(fb.getName());
return convertView;
}
private class ViewHolder{
ImageView mImg;
TextView mDirName;
TextView mDirCount;
}
}
}
ImageAdapter
import java.util.HashSet
import java.util.List
import java.util.Set
import android.content.Context
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.View.OnClickListener
import android.widget.BaseAdapter
import android.widget.ImageButton
import android.widget.ImageView
import com.example.imageloader.R
import com.example.imageloader.utils.ImageLoader
import com.example.imageloader.utils.ImageLoader.Type
public class ImageAdapter extends BaseAdapter{
private static Set<String> mSelectedImg=new HashSet<String>()
private String mDirPath
private List<String> mImgPaths
private LayoutInflater mInflater
public ImageAdapter(Context context,List<String> mImgPaths,String mDirPath){
this.mDirPath=mDirPath
this.mImgPaths=mImgPaths
mInflater=LayoutInflater.from(context)
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mImgPaths.size()
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mImgPaths.get(position)
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder
if(convertView==null){
holder=new ViewHolder()
convertView=mInflater.inflate(R.layout.item_gridview, parent,false)
holder.mImg=(ImageView) convertView.findViewById(R.id.iv)
holder.mSelect=(ImageButton) convertView.findViewById(R.id.ib)
convertView.setTag(holder)
}else{
holder=(ViewHolder) convertView.getTag()
}
//重置状态
holder.mImg.setImageResource(R.drawable.ic_launcher)
holder.mSelect.setImageResource(R.drawable.a0a)
holder.mImg.setColorFilter(null)
ImageLoader.getInstance(3, Type.LIFO).loadImage(mDirPath+ "/" +mImgPaths.get(position), holder.mImg)
final String filePath=mDirPath+ "/" +mImgPaths.get(position)
holder.mImg.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(mSelectedImg.contains(filePath)){
mSelectedImg.remove(filePath)
holder.mImg.setColorFilter(null)
holder.mSelect.setImageResource(R.drawable.a0a)
}else{
mSelectedImg.add(filePath)
holder.mImg.setColorFilter(Color.parseColor("#77000000"))
holder.mSelect.setImageResource(R.drawable.a0_)
}
//notifyDataSetChanged()
}
})
if(mSelectedImg.contains(filePath)){
holder.mImg.setColorFilter(Color.parseColor("#77000000"))
holder.mSelect.setImageResource(R.drawable.a0_)
}
return convertView
}
class ViewHolder{
ImageView mImg
ImageButton mSelect
}
}
FolderBean
public class FolderBean {
private String dir;
private String firstImagePath;
private String name;
private int count;
public FolderBean() {
}
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
int lastIndexOf=this.dir.lastIndexOf("/");
this.name=this.dir.substring(lastIndexOf+1);
}
public String getFirstImagePath() {
return firstImagePath;
}
public void setFirstImagePath(String firstImagePath) {
this.firstImagePath = firstImagePath;
}
public String getName() {
return name;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
ImageLoader
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v4.util.LruCache;
import android.util.DisplayMetrics;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
public class ImageLoader {
/**
* 图片加载类
*/
private static ImageLoader mInstance;
private LruCache<String, Bitmap> mLruCache;
private ExecutorService mThreadPool;
private static final int THREAD_COUNT=1;
private Thread mPoolThread;
private Handler mPoolThreadHandler;
private Handler mUIHandler;
private Type mType=Type.LIFO;
private LinkedList<Runnable> mTaskQueue;
private Semaphore sePoolTH=new Semaphore(0);
private Semaphore sePoolT;
public enum Type{
FIFO,LIFO
}
private ImageLoader(int threadCont,Type type) {
init(threadCont,type);
}
private void init(int threadCont, Type type) {
mPoolThread=new Thread(){
@Override
public void run() {
Looper.prepare();
mPoolThreadHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
mThreadPool.execute(getTask());
try {
sePoolT.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
sePoolTH.release();
Looper.loop();
}
};
mPoolThread.start();
int maxMemory=(int) Runtime.getRuntime().maxMemory();
int cacheMemory=maxMemory/8;
mLruCache=new LruCache<String, Bitmap>(cacheMemory){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
mThreadPool=Executors.newFixedThreadPool(threadCont);
mTaskQueue=new LinkedList<Runnable>();
mType=type;
sePoolT=new Semaphore(threadCont);
}
private Runnable getTask() {
if(mType==Type.FIFO){
return mTaskQueue.removeFirst();
}else if(mType==Type.LIFO){
return mTaskQueue.removeLast();
}
return null;
}
public static ImageLoader getInstance(int threadCont, Type type){
if(mInstance==null){
synchronized (ImageLoader.class) {
if(mInstance==null){
mInstance=new ImageLoader(THREAD_COUNT,Type.LIFO);
}
}
}
return mInstance;
}
public void loadImage(final String path,final ImageView imageView){
imageView.setTag(path);
if(mUIHandler==null){
mUIHandler=new Handler(){
public void handleMessage(Message msg) {
ImgBeanHolder holder=(ImgBeanHolder) msg.obj;
Bitmap bitmap=holder.bitmap;
ImageView imageView=holder.imageView;
String path=holder.path;
if(imageView.getTag().toString().equals(path)){
imageView.setImageBitmap(bitmap);
}
};
};
}
Bitmap bm=getBitmapFromLruCache(path);
if(bm!=null){
Message message=Message.obtain();
ImgBeanHolder holder=new ImgBeanHolder();
holder.bitmap=bm;
holder.path=path;
holder.imageView=imageView;
message.obj=holder;
mUIHandler.sendMessage(message);
}else{
addTasks(new Runnable() {
@Override
public void run() {
ImageSize imageSize=getImageViewSize(imageView);
Bitmap bm=decodeSampledBitmap(path,imageSize.width,imageSize.height);
addBitampLruCache(path,bm);
Message message=Message.obtain();
ImgBeanHolder holder=new ImgBeanHolder();
holder.bitmap=bm;
holder.path=path;
holder.imageView=imageView;
message.obj=holder;
mUIHandler.sendMessage(message);
sePoolT.release();
}
});
}
}
protected void addBitampLruCache(String path, Bitmap bm) {
if(getBitmapFromLruCache(path)==null){
if(bm!=null){
mLruCache.put(path, bm);
}
}
}
protected Bitmap decodeSampledBitmap(String path, int width, int height) {
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize=caculateInSampleSize(options,width,height);
options.inJustDecodeBounds=false;
Bitmap bitmap=BitmapFactory.decodeFile(path, options);
return bitmap;
}
private int caculateInSampleSize(Options options, int reqwidth, int reqheight) {
int width=options.outWidth;
int height=options.outHeight;
int sampleSize=1;
if(width>reqwidth||height>reqheight){
int widthbili=Math.round(width*1.0f/reqwidth);
int heightbili=Math.round(height*1.0f/reqheight);
sampleSize=Math.max(widthbili, heightbili);
}
return sampleSize;
}
protected ImageSize getImageViewSize(ImageView imageView) {
ImageSize imageSize=new ImageSize();
DisplayMetrics dm= imageView.getContext().getResources().getDisplayMetrics();
LayoutParams lp=imageView.getLayoutParams();
int width= imageView.getWidth();
if(width<=0){
width=lp.width;
}
if(width<=0){
width= getImageValue(imageView, "mMaxWidth");
}
if(width<=0){
width=dm.widthPixels;
}
int height= imageView.getHeight();
if(height<=0){
height=lp.height;
}
if(height<=0){
height= getImageValue(imageView, "mMaxHeight");
}
if(height<=0){
height=dm.heightPixels;
}
imageSize.width=width;
imageSize.height=height;
return imageSize;
}
private static int getImageValue(Object object,String name){
int value=0;
try {
Field field=ImageView.class.getDeclaredField(name);
field.setAccessible(true);
try {
int fieldValue=field.getInt(object);
if(fieldValue>0 && fieldValue<Integer.MAX_VALUE){
value=fieldValue;
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return value;
}
private synchronized void addTasks(Runnable runnable) {
mTaskQueue.add(runnable);
try {
if(mPoolThreadHandler==null)
sePoolTH.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
mPoolThreadHandler.sendEmptyMessage(0x110);
}
private Bitmap getBitmapFromLruCache(String key) {
return mLruCache.get(key);
}
private class ImgBeanHolder{
Bitmap bitmap;
ImageView imageView;
String path;
}
private class ImageSize{
int width;
int height;
}
}