图片选择器

摘要:
popWindow.setOnDirSelectedListener(newBasePopWindow.OnDirSelectedListeners(){@OverridepublicvotionSelected(Beanbean){mCurrentDir=newFile(bean.getDir());

注释比较少。。。直接贴代码吧,主要有popupWindow的实现,然后通过ContentResolver便利自己手机里的所有图片,直接贴代码吧

主Activity的实现

public class MainActivity extends Activity {

    private GridView id_gridView;
    private TextView dir_name;
    private TextView dir_pic;
    private RelativeLayout bottom;
    private List<String> mImgs;


    private BasePopWindow popWindow;
    private ProgressDialog mProgressDialog;
    private File mCurrentDir;
    private int mMaxCount;

    private List<Bean> ListBean = new ArrayList<Bean>();


    private ImageAdapter mImgAdapter;
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
           if(msg.what == 0x110)
           {

               mProgressDialog.dismiss();
               //绑定数据到View中
               data2View();

               initPopWindow();

           }
        }
    };

    protected void initPopWindow()
    {
        popWindow = new BasePopWindow(this,ListBean);
        popWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                lightOn();
            }
        });
        popWindow.setOnDirSelectedListener(new BasePopWindow.OnDirSelectedListener() {
            @Override
            public void onSelected(Bean bean) {
                mCurrentDir = new File(bean.getDir());
                mImgs = 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,mImgs,mCurrentDir.getAbsolutePath());
                id_gridView.setAdapter(mImgAdapter);

                dir_name.setText(bean.getName());
                dir_pic.setText(mImgs.size()+"");
                popWindow.dismiss();

            }
        });
    }
    //内容区域变亮
    protected void lightOn()
    {
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.alpha = 1.0f;
        getWindow().setAttributes(lp);
    }
    //内容区域变暗
    protected void lightOff()
    {
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.alpha = 0.3f;
        getWindow().setAttributes(lp);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initDatas();
        initEvent();
    }

    protected void data2View()
    {
        if(mCurrentDir == null)
        {
            Toast.makeText(this,"未扫描到任何图片",Toast.LENGTH_SHORT).show();
            return;
        }
        mImgs = Arrays.asList(mCurrentDir.list());
        mImgAdapter = new ImageAdapter(MainActivity.this, mImgs ,mCurrentDir.getAbsolutePath());
        id_gridView.setAdapter(mImgAdapter);
        dir_name.setText(mMaxCount + "");
        dir_pic.setText(mCurrentDir.getName());


    }
    private void initView()
    {
        id_gridView = (GridView)findViewById(R.id.id_gridView);
        bottom = (RelativeLayout)findViewById(R.id.bottom);
        dir_name =(TextView) findViewById(R.id.dir_name);
        dir_pic = (TextView)findViewById(R.id.dir_pic);
    }
    private void initEvent() {

        bottom.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popWindow.setAnimationStyle(R.style.dir_popwindow_anim);
                popWindow.showAsDropDown(bottom,0,0);
                lightOff();
            }
        });
    }

    //利用ContentProvider扫描手机中的所有照片
    private void initDatas() {

        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
        {
            Toast.makeText(this,"当前存储卡不可用",Toast.LENGTH_SHORT).show();
            return;
        }
        mProgressDialog = ProgressDialog.show(this,null,"正在加载");
        new Thread()
        {
            public void run()
            {
                Uri mImgUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                ContentResolver cr = MainActivity.this.getContentResolver();
                Cursor 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 parenFile = new File(path).getParentFile();
                    if(parenFile == null)
                        continue;
                    String dirPath = parenFile.getAbsolutePath();
                    Bean bean = null;
                    if(mDirPaths.contains(dirPath))
                    {
                        continue;
                    }else
                    {
                        mDirPaths.add(dirPath);
                        bean = new Bean();
                        bean.setDir(dirPath);
                        bean.setFirstImgPath(path);
                    }


                    if(parenFile.list() == null)
                        continue;
                    int picSize = parenFile.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;
                    bean.setCount(picSize);
                    ListBean.add(bean);
                    if(picSize > mMaxCount)
                    {
                        mMaxCount = picSize;
                        mCurrentDir = parenFile;
                    }



                }
                cursor.close();
                //扫描完成,释放临时变量的内存
                //mDirPaths = null;
                //通知handler扫描图片完成
                mHandler.sendEmptyMessage(0x110);
            }
        }.start();

    }

}
自己定义的Bean类

public class Bean {


    private String dir;
    private  String firstImgPath;
    private  String name;
    private int count;
    public String getDir() {
        return dir;
    }

    public void setDir(String dir) {
        this.dir = dir;
        int lastIndexOf = this.dir.lastIndexOf("/");
        this.name = this.dir.substring(lastIndexOf);
    }

    public String getFirstImgPath() {
        return firstImgPath;
    }
    public void setFirstImgPath(String firstImgPath) {
        this.firstImgPath = firstImgPath;
    }
    public String getName() {
        return name;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }


}
ImageAdapter类

public class ImageAdapter extends BaseAdapter
{
    private Set<String> mSelectedImg = new HashSet<String>();

    private String mDirPath;                                  //图片所在文件夹路径
    private List<String> mImgPaths = new ArrayList<String>(); //图片名称的List集合
    private LayoutInflater mInflater;
    private Context mContext;
    @Override
    public int getCount() {
        return mImgPaths.size();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if(convertView == null)
        {
            convertView = mInflater.inflate(R.layout.item,parent,false);
            holder = new ViewHolder();
            holder.img = (ImageView)convertView.findViewById(R.id.item_image);
            holder.img_btn= (ImageButton)convertView.findViewById(R.id.item_selected);
            convertView.setTag(holder);

        }
        else
        {
            holder = (ViewHolder)convertView.getTag();
        }
        //重置状态
        holder.img.setImageResource(R.drawable.lableperson);
        holder.img_btn.setImageResource(R.drawable.the1no);
        holder.img.setColorFilter(null);
        final String filePath = mDirPath+"/"+mImgPaths.get(position);
        holder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                //已经被选择,再次点击就会被取消
                if(mSelectedImg.contains(filePath))
                {
                    mSelectedImg.remove(filePath);
                    holder.img.setColorFilter(null);
                    holder.img_btn.setImageResource(R.drawable.the1no);
                }else //未被选择,点击会被选择
                {
                    mSelectedImg.add(filePath);
                    holder.img.setColorFilter(Color.parseColor("#77000000"));
                    holder.img_btn.setImageResource(R.drawable.the1yes);

                }
               // notifyDataSetChanged();去掉解决闪屏的问题
            }
        });

        if(mSelectedImg.contains(filePath))
        {
            holder.img.setColorFilter(Color.parseColor("#77000000"));
            holder.img_btn.setImageResource(R.drawable.the1yes);
        }

        ImageLoader.getInstance(3, ImageLoader.Type.LIFO).loadImage(mDirPath+"/"+mImgPaths.get(position),holder.img);
        return convertView;
    }

    @Override
    public Object getItem(int position) {
        return mImgPaths.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public ImageAdapter(Context context , List<String> mDatas , String dirPath)
    {

        this.mContext=context;
        this.mImgPaths=mDatas;
        this.mDirPath=dirPath;
        mInflater=LayoutInflater.from(context);

    }
    private class ViewHolder
    {
        public ImageView img;
        public ImageButton img_btn;
    }
}

popWindow类的实现

public class BasePopWindow extends PopupWindow {
    private int mWidth;
    private int mHeight;
    private View mConvertView;
    private List<Bean> mDatas;
    private ListView mListView;
    private Context mContext;
    public interface OnDirSelectedListener
    {
        void onSelected(Bean bean);
    }
    public OnDirSelectedListener mListener;
    public void setOnDirSelectedListener(OnDirSelectedListener mListener)
    {
        this.mListener = mListener;
    }
    public BasePopWindow(Context context, List<Bean> datas)
    {
        calWidHeight(context);
        mConvertView = LayoutInflater.from(context).inflate(R.layout.popwindow,null);
        mDatas = datas;
        setContentView(mConvertView);
        setWidth(mWidth);
        setHeight(mHeight);
        setFocusable(true);
        setTouchable(true);
        setOutsideTouchable(true);
        setBackgroundDrawable(new BitmapDrawable());
        setTouchInterceptor(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_OUTSIDE)
                {
                    dismiss();
                    return true;
                }
                return false;
            }
        });

        initViews(context);
        initEvents();
    }
    private void initViews(Context context)
    {

        mListView = (ListView)mConvertView.findViewById(R.id.list_pop);
        mListView.setAdapter(new ListAdapter(context ,mDatas));
    }
    private void initEvents()
    {
          mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                  if(mListener != null)
                  {
                      mListener.onSelected(mDatas.get(position));
                  }
              }
          });
    }
    //计算popWindow的宽度和高度
    private void calWidHeight(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 ListAdapter extends ArrayAdapter<Bean>
    {

        private LayoutInflater mInflater;
        private List<Bean> mDatas;
        public ListAdapter(Context context,
                           List<Bean> objects) {
            super(context, 0, objects);
            mInflater = LayoutInflater.from(context);
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if(convertView == null)
            {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.pop_item,parent,false);
                holder.mImg = (ImageView)convertView.findViewById(R.id.item_image_pop);
                holder.mDirName = (TextView)convertView.findViewById(R.id.item_name_pop);
                holder.mDirCount = (TextView)convertView.findViewById(R.id.item_count_pop);
                convertView.setTag(holder);
            }else
            {
                holder = (ViewHolder)convertView.getTag();
            }
            Bean bean = getItem(position);
            //重置
            holder.mImg.setImageResource(R.drawable.the1no);


            ImageLoader.getInstance().loadImage(bean.getFirstImgPath(),holder.mImg);
            holder.mDirCount.setText(bean.getCount()+"");
            holder.mDirName.setText(bean.getName());

            return convertView;
        }
        private class ViewHolder
        {
            ImageView mImg;
            TextView mDirName;
            TextView mDirCount;
        }
    }
}
xml文件就省略了


免责声明:文章转载自《图片选择器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql复制表和表结构Ubuntu16.04安装Python3.6 和pip下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Effective C# 原则9:明白几个相等运算之间的关系(译)

Effective C# 原则9:明白几个相等运算之间的关系(译)Item 9: Understand the Relationships Among ReferenceEquals(), static Equals(), instance Equals(), and operator== 明白ReferenceEquals(), static Equal...

Android 开关机动画规范

极力推荐文章:欢迎收藏Android 干货分享 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: 一、开机动画压缩格式必须为存储方式 二、开机动画压缩包不能包含bootanimation文件夹 三、开机动画图片 size 以及格式需要完全统一 四、开机动画帧率,播放速度配置方案 一、开机动画压缩格式必须为存储方...

Flash Images 效果实现(原作)

        前一些时间,看到好多网站上的Flash Images新闻,效果很是不错.当时很是感兴趣,自己就想研究一下此效果是怎么实现的.于是Google啊,没有找到我想要的源代码,或在一个群里,一个网友给了他们公司一个同事一前用过的一段代码;但另人失望的是,那个代码是Javascript静态实现图片滚动新闻的;但我们实际应用中不可能做成静态的吧,那样就...

hbase协处理器编码实例

Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器。Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionServer上对数据执行自定义计算,而不是在客户端上执行计算。 本文是以上两者的简单实例,使用的环境:环境 jdk1.8 hadoop2.6.5 hbase1.2....

uniapp支付宝小程序上传图片转base64

最近使用uniapp涉及到一个上传图片的功能,原本看官方文档api觉得没问题,正常开发, 1. 首先微信端没问题 uni.getFileSystemManager().readFile({ filePath: url, //选择图片返回的相对路径 encoding: "base64", //编码格式 succes...

WPF 大数据加载过程中的等待效果——圆圈转动

大家肯定遇到过或将要遇到加载大数据的时候,如果出现长时间的空白等待,一般人的概念会是:难道卡死了? 作为一个懂技术的挨踢技术,即使你明知道数据量太大正在加载,但是假如看不到任何动静,自己觉得还是一种很不好的体验。 之前做项目的时候有这方面的要求,我的前辈们早已给出了完美的解决方案。最近自己在努力学习,今天拿出来与大家一起分享,我想一定会有帮助的。看过之后大...