大概是这么个效果,类似与微信朋友圈选择图片的效果,如下图所示
首先,图片预览的这个界面我用的是GridView,当然也可以使用GridLayout,根据需求制定行列即可。同时重写适配器实现末尾是添加图片的ImageView,GridView的item可以用imageview,也可以用PhotoView,加载图片可以用Glide或者fresco.
实现最后为添加图片的核心代码为:
@Override public int getCount() { //mlist为图片源 ,+1为最后添加图片 int count = mList == null ? 1 : mList.size() + 1; if (count > MAX_PICS) { //MAX_PICS为图片数量限制 return mList.size(); } else { return count; } }
@Override public View getView(int position, View convertView, ViewGroup parent) { convertView = inflater.inflate(R.layout.grid_item, parent,false); ImageView iv = (ImageView) convertView.findViewById(R.id.iv_pic); if (position < mList.size()) { //前面的正常加载图片 picUrl为图片路径 String picUrl = mList.get(position); Glide.with(mContext).load(picUrl).into(iv); } else { //最后一个显示添加图片按钮 iv.setImageResource(R.mipmap.icon_add_pic); } return convertView; }
实现添加图片的功能需要使用到PictureSelector这个开源库,比较推荐这个的原因是因为通过配置一些参数可以非常方便的选择显示内容的类型,可以支持视频图片音频等,而且在他的文档中也提供了常见的异常的解决办法,通过结果回调就可以方便的获得图片的url了
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case PictureConfig.CHOOSE_REQUEST: // 图片、视频、音频选择结果回调 List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data); // 例如 LocalMedia 里面返回三种path // 1.media.getPath(); 为原图path // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true 注意:音视频除外 // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true 注意:音视频除外 // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的 adapter.setList(selectList); adapter.notifyDataSetChanged(); break; } } }
总体实现思路就是这样的了,目前使用情况正常,可以根据实际的需求做出相应的修改即可。