圖片選擇器

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                                                                                                    

發佈了12 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章