1.ImageLoader
package com.example.administrator.myapplication; import android.content.Context; import android.graphics.Color; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * Created by Administrator on 2017/8/10 0010. */ public class ImageAdapter extends BaseAdapter { public static Set<String> mSelectImgs = new HashSet<>(); private String mDirPath; private List<String> mImgPaths; private LayoutInflater mInflater; /** * 圖片名和路徑分開存儲可以節省內存 * * @param context * @param mDatas 存儲圖片的名字 * @param dirPath 存儲圖片的路徑 */ public ImageAdapter(Context context, List<String> mDatas, String dirPath) { this.mDirPath = dirPath; this.mImgPaths = mDatas; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mImgPaths.size(); } @Override public Object getItem(int i) { return mImgPaths.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(final int position, View view, ViewGroup parent) { final ViewHolder viewHolder; if (view == null) { view = mInflater.inflate(R.layout.item_grideview, parent, false); viewHolder = new ViewHolder(); viewHolder.mImag = (ImageView) view.findViewById(R.id.id_item_image); viewHolder.mSelect = (ImageButton) view.findViewById(R.id.id_item_select); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } //重置狀態 換屏時爲初始狀態 viewHolder.mImag.setImageResource(R.mipmap.pictures_no); viewHolder.mSelect.setImageResource(R.mipmap.picture_unselected); viewHolder.mImag.setColorFilter(null); final String filePath = mDirPath + "/" + mImgPaths.get(position); viewHolder.mImag.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //已經被選擇 if (mSelectImgs.contains(filePath)) { mSelectImgs.remove(filePath); viewHolder.mImag.setColorFilter(null); viewHolder.mSelect.setImageResource(R.mipmap.pictures_no); }else{//沒有被選擇 mSelectImgs.add(filePath); viewHolder.mImag.setColorFilter(Color.parseColor("#77000000")); viewHolder.mSelect.setImageResource(R.mipmap.pictures_selected); } Iterator<String> iterator=mSelectImgs.iterator(); while(iterator.hasNext()){ Log.e("zm",iterator.next()); } } }); if(mSelectImgs.contains(filePath)){ viewHolder.mImag.setColorFilter(Color.parseColor("#77000000")); viewHolder.mSelect.setImageResource(R.mipmap.pictures_selected); } ImageLoader.getInstance(3, ImageLoader.Type.LIFO).loadImage(mDirPath + "/" + mImgPaths.get(position), viewHolder.mImag); return view; } private class ViewHolder { ImageView mImag; ImageButton mSelect; } }2.MainActivity
package com.example.administrator.myapplication; import android.app.ProgressDialog; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.widget.GridView; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; public class MainActivity extends AppCompatActivity { int index; private GridView mGridView; private ImageAdapter mImgAdapter; /** * 存儲圖片的名稱 */ private List<String> mImgs; private RelativeLayout mBottomLy; private TextView mDirName; private TextView mDirCount; private File mCurrentDir; private int mMaxCount; /** * mFolderBeans:幾個文件夾 */ private List<FolderBean> mFolderBeans = new ArrayList<>(); private ProgressDialog mProgressDialog; private ListImageDirPopuoWindow mListImageDirPopuoWindow; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { mProgressDialog.dismiss(); //綁定數據到View中 data2View(); initDirPopupWindow(); } }; private void initDirPopupWindow() { mListImageDirPopuoWindow = new ListImageDirPopuoWindow(getApplicationContext(),mFolderBeans); mListImageDirPopuoWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { lightOn(); } }); mListImageDirPopuoWindow.setOnSelect(new ListImageDirPopuoWindow.OnDirSelectListener() { @Override public void onSelected(FolderBean folderBean) { mCurrentDir = new File(folderBean.getDir()); mImgs = Arrays.asList(mCurrentDir.list(new FilenameFilter() { @Override public boolean accept(File file, String fileName) { if(fileName.endsWith(".jpg") ||fileName.endsWith(".jpeg") ||fileName.endsWith(".png")){ return true; } return false; } })); mImgAdapter = new ImageAdapter(MainActivity.this,mImgs,mCurrentDir.getAbsolutePath()); mGridView.setAdapter(mImgAdapter); mDirCount.setText(mImgs.size()+""); mDirName.setText(mCurrentDir.getName()); mListImageDirPopuoWindow.dismiss(); } }); } /** * 內容區域變亮 */ private void lightOn() { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = 1.0f; getWindow().setAttributes(lp); } /** * 內容區域變暗 */ private void lightOff() { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = .3f; getWindow().setAttributes(lp); } /** * 綁定數據到View中 */ private void data2View() { if (mCurrentDir == null) { Toast.makeText(getApplicationContext(), "未掃描到任何圖片", Toast.LENGTH_SHORT).show(); return; } mImgs = Arrays.asList(mCurrentDir.list()); mImgAdapter = new ImageAdapter(MainActivity.this, mImgs, mCurrentDir.getAbsolutePath()); mGridView.setAdapter(mImgAdapter); mDirCount.setText(mMaxCount + ""); mDirName.setText(mCurrentDir.getName()); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); initDatas(); initEvens(); } private void initViews() { mGridView = (GridView) findViewById(R.id.id_grideview); mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly); 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(getApplicationContext(), "當前存儲卡不可用", Toast.LENGTH_SHORT).show(); return; } mProgressDialog = ProgressDialog.show(this, null, "正在加載..."); new Thread() { @Override public void run() { super.run(); //拿到有圖片的uri 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.setFirstImgPath(path); } if (parentFile.list() == null) continue; int picSize = parentFile.list(new FilenameFilter() {//過濾文件 @Override public boolean accept(File file, 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(); //通知mHandler圖片掃描完成 0x100:爲任意值 mHandler.sendEmptyMessage(0x100); } }.start(); } private void initEvens() { mBottomLy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mListImageDirPopuoWindow.setAnimationStyle(R.style.dir_popupwindow_anim); mListImageDirPopuoWindow.showAsDropDown(mBottomLy,0,0); //內容背景變黑 lightOff(); } }); } }3.ImageAdapter
package com.example.administrator.myapplication; import android.content.Context; import android.graphics.Color; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * Created by Administrator on 2017/8/10 0010. */ public class ImageAdapter extends BaseAdapter { public static Set<String> mSelectImgs = new HashSet<>(); private String mDirPath; private List<String> mImgPaths; private LayoutInflater mInflater; /** * 圖片名和路徑分開存儲可以節省內存 * * @param context * @param mDatas 存儲圖片的名字 * @param dirPath 存儲圖片的路徑 */ public ImageAdapter(Context context, List<String> mDatas, String dirPath) { this.mDirPath = dirPath; this.mImgPaths = mDatas; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mImgPaths.size(); } @Override public Object getItem(int i) { return mImgPaths.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(final int position, View view, ViewGroup parent) { final ViewHolder viewHolder; if (view == null) { view = mInflater.inflate(R.layout.item_grideview, parent, false); viewHolder = new ViewHolder(); viewHolder.mImag = (ImageView) view.findViewById(R.id.id_item_image); viewHolder.mSelect = (ImageButton) view.findViewById(R.id.id_item_select); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } //重置狀態 換屏時爲初始狀態 viewHolder.mImag.setImageResource(R.mipmap.pictures_no); viewHolder.mSelect.setImageResource(R.mipmap.picture_unselected); viewHolder.mImag.setColorFilter(null); final String filePath = mDirPath + "/" + mImgPaths.get(position); viewHolder.mImag.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //已經被選擇 if (mSelectImgs.contains(filePath)) { mSelectImgs.remove(filePath); viewHolder.mImag.setColorFilter(null); viewHolder.mSelect.setImageResource(R.mipmap.pictures_no); }else{//沒有被選擇 mSelectImgs.add(filePath); viewHolder.mImag.setColorFilter(Color.parseColor("#77000000")); viewHolder.mSelect.setImageResource(R.mipmap.pictures_selected); } Iterator<String> iterator=mSelectImgs.iterator(); while(iterator.hasNext()){ Log.e("zm",iterator.next()); } } }); if(mSelectImgs.contains(filePath)){ viewHolder.mImag.setColorFilter(Color.parseColor("#77000000")); viewHolder.mSelect.setImageResource(R.mipmap.pictures_selected); } ImageLoader.getInstance(3, ImageLoader.Type.LIFO).loadImage(mDirPath + "/" + mImgPaths.get(position), viewHolder.mImag); return view; } private class ViewHolder { ImageView mImag; ImageButton mSelect; } }4.ListImageDirPopupWindow
package com.example.administrator.myapplication; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.support.annotation.IdRes; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; import java.util.List; /** * Created by Administrator on 2017/8/11 0011. */ public class ListImageDirPopuoWindow extends PopupWindow { private int mWidth; private int mHeight; private View mConvertView; private List<FolderBean> mDatas; private OnDirSelectListener mOnDirSelectListener; ListView mListView; /** * 定義接口回調 */ public interface OnDirSelectListener { void onSelected(FolderBean folderBean); } public void setOnSelect(OnDirSelectListener mOnDirSelectListener) { this.mOnDirSelectListener = mOnDirSelectListener; } public ListImageDirPopuoWindow(Context context, List<FolderBean> mDatas) { calWidthAndHeight(context); mConvertView = LayoutInflater.from(context).inflate(R.layout.popup_main, null); this.mDatas = mDatas; setContentView(mConvertView); setWidth(mWidth); setHeight(mHeight); setFocusable(true); setTouchable(true); //外部可點擊 setOutsideTouchable(true); //點擊外面的區域使popupWindow消失 setBackgroundDrawable(new BitmapDrawable()); setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_OUTSIDE) { dismiss(); return true; } return false; } }); initViews(context); initEvens(); } private void initViews(Context context) { mListView = mConvertView.findViewById(R.id.id_list_dir); mListView.setAdapter(new ListDirAdapter(context, mDatas)); } private void initEvens() { mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { if (mOnDirSelectListener != null) { mOnDirSelectListener.onSelected(mDatas.get(i)); } } }); } /** * 計算popupWindow的寬度和高度 * * @param context */ private void calWidthAndHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); mWidth = outMetrics.widthPixels; mHeight = (int) (outMetrics.heightPixels * 0.7); } private class ListDirAdapter extends ArrayAdapter<FolderBean> { private LayoutInflater mInflater; private List<FolderBean> mDatas; public ListDirAdapter(@NonNull Context context, @NonNull List<FolderBean> objects) { super(context, 0, objects); mDatas = objects; mInflater = LayoutInflater.from(context); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.item_popup, parent, false); holder.mImg = convertView.findViewById(R.id.id_id_dir_item_image); holder.mDirName = convertView.findViewById(R.id.id_dir_item_name); holder.mDirCount = convertView.findViewById(R.id.tv_count); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } FolderBean bean = getItem(position); //重置 holder.mImg.setImageResource(R.mipmap.pictures_no); //回調加載 ImageLoader.getInstance().loadImage(bean.getFirstImgPath(), holder.mImg); holder.mDirName.setText(bean.getName()); holder.mDirCount.setText(bean.getCount() + ""); return convertView; } private class ViewHolder { ImageView mImg; TextView mDirName; TextView mDirCount; } } }5.主要佈局文件
1.activity_main
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff"> <GridView android:layout_above="@+id/id_bottom_ly" android:id="@+id/id_grideview" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@android:color/transparent" android:horizontalSpacing="3dp" android:listSelector="@android:color/transparent" android:numColumns="3" android:stretchMode="columnWidth" android:verticalSpacing="3dp" /> <RelativeLayout android:id="@+id/id_bottom_ly" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="#ee000000" android:clipChildren="true"> <TextView android:id="@+id/id_dir_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:paddingLeft="10dp" android:text="所有圖片" android:textColor="@android:color/white" /> <TextView android:id="@+id/id_dir_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:paddingRight="10dp" android:text="100張" android:textColor="@android:color/white" /> </RelativeLayout>> </RelativeLayout>
2.item_grideview
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!--centerCrop :防止圖片變形--> <ImageView android:id="@+id/id_item_image" android:layout_width="match_parent" android:layout_height="100dp" android:scaleType="centerCrop" android:src="@mipmap/pictures_no" /> <ImageButton android:id="@+id/id_item_select" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="3dp" android:layout_marginTop="3dp" android:background="@null" android:clickable="false" android:src="@mipmap/picture_unselected" /> </RelativeLayout>
3.item_popup
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:padding="5dp"> <!--centerCrop :防止圖片變形--> <ImageView android:id="@+id/id_id_dir_item_image" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:background="@mipmap/pic_dir" android:paddingBottom="17dp" android:paddingLeft="12dp" android:paddingRight="12dp" android:paddingTop="9dp" android:scaleType="fitXY" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="12dp" android:layout_toRightOf="@+id/id_id_dir_item_image" android:orientation="vertical"> <TextView android:id="@+id/id_dir_item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="所有圖片" android:textSize="10dp" /> <TextView android:id="@+id/tv_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="100張" android:textColor="#444" android:textSize="10dp" /> </LinearLayout> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="20dp" android:src="@mipmap/dir_choose" /> </RelativeLayout>4.popup_main
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/id_list_dir" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="#eee3d9" android:dividerHeight="1dp" /> </LinearLayout>5.tv
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@drawable/tv_bg" android:textColor="#5BC4ED" android:text="Helloworld" > </TextView>6.自定義動畫
1.splide_up
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="200" android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="100%" android:toYDelta="0" /> </set>
2.splide_down
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="200" android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="0" android:toYDelta="100%" /> </set>
7.style
<style name="dir_popupwindow_anim"> <item name="android:windowEnterAnimation">@anim/splide_up</item> <item name="android:windowExitAnimation">@anim/splide_down</item> </style>
源碼地址:http://download.csdn.net/download/qq_34123326/9929894