图片选择器

来源:互联网 发布:淘宝店有流量没销量 编辑:程序博客网 时间:2024/05/21 11:28

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                                                                                                    

原创粉丝点击