编程

当前位置:澳门新莆京娱乐官网 > 编程 > 私人订制Android本地图片选择器

私人订制Android本地图片选择器

来源:http://www.drgigabytes.com 作者:澳门新莆京娱乐官网 时间:2020-03-23 05:37

效果图

图片 1效果图

急需解析

  • 网格构造展现本地图片
  • 支撑图片多选
  • 支撑选中的图纸预览
  • 未接受图片时不可预览
  • 由已选多图变为无图时可脱离图片采用页面
  • 图表已选到达上限后仍然能够跳转图片采纳页面

其三方框架使用

史上最强的安卓图片采取器——GalleryFinal;简书博客地址——

完成指标

行使并改过第三方框架GalleryFinal源码,实现效果与利益图的样式。

切切实实得以完结

  • 导入GalleryFinal源码从GalleryFinal的Github饭馆中拷贝堆栈地址,使用git指令cloneGalleryFinal源代码到地面:
git clone https://github.com/pengjianbo/GalleryFinal.git

筛选Android Studio菜单栏File->New->import Module...,导入GalleryFinal源代码到Android Studio:

图片 2导入GalleryFinal源码详细的情况参见:程序员修炼之道-本事篇之git指令Android Studio导入第三方库的二种方法

  • 写一个GridView这里声雅培下,选用图片的Activity是GalleryFinal自带的,所以大家这边要写的GridView是用来展现选中并再次回到的图片,这里的代码就不放出来了,效果图如下:

    图片 3未采纳时图片 4选取图片时自己达成的可帮助最大图片数量是5,在图纸选满的时候依然显得“+”,用以跳转图片采取页面选择别的图片。

  • 初始化GalleryFinal配置

    • 由此代码设置图片选用器的标题栏背景颜色,标题文本颜色,浮动按键颜色;
    • 由此监听事件,到达滚动时不加载图片,停下来时加载图片,完毕优化;
    • 带头化成效配置;

    为卫戍代码分开查看招致逻辑的繁琐,将上述配置代码一起贴上,上边包车型地铁代码可放在跳转图片选拔分界面包车型大巴开关点击事件中。此地重申一下:mThemeConfig = new ThemeConfig.Builder(卡塔尔国.setTitleBarBgColor等方法传参是整型,可是其传播的是颜色值而非财富文件的id。代码注释较详细,其余不做过多解说:

// ------- 声明 -------// 主题配置private ThemeConfig mThemeConfig;// 图片加载器private cn.finalteam.galleryfinal.ImageLoader mGlidImgLoader;// 滚动监听事件private PauseOnScrollListener mPauseOnScrollListener;// 功能配置private FunctionConfig mFunctionConfig;// 核心配置private CoreConfig mCoreConfig;// ------- 实现 -------// 获取标题栏背景颜色int colorTitleBarBg = ContextCompat.getColor(Activity.this, R.color.titleBarBgColor);// 标题栏文字颜色int colorTitleBarText = ContextCompat.getColor(Activity.this, R.color.titleBarTextColor);// 浮动按钮常规颜色int colorFabNormal = ContextCompat.getColor(Activity.this, R.color.color_ffaa2a);// 浮动按钮点击颜色int colorFabPressed = ContextCompat.getColor(Activity.this, R.color.color_e29428);// 标题栏按钮颜色int colorTitleBarIcon = ContextCompat.getColor(MainActivity.this, R.color.colorTitleBarIcon);// 设置主题mThemeConfig = new ThemeConfig.Builder() .setTitleBarBgColor(colorTitleBarBg) // 设置标题栏背景颜色 .setTitleBarTextColor(colorTitleBarText) // 设置标题栏文字颜色 .setFabNormalColor(colorFabNormal) // 设置浮动按钮常规颜色 .setFabPressedColor(colorFabPressed) // 设置浮动按钮点击颜色 .setCheckSelectedColor(colorFabNormal) // 设置选中标记的颜色和按钮的颜色相同 .setTitleBarIconColor(colorTitleBarIcon) // 设置标题栏按钮颜色 .setIconBack(R.drawable.ic_back) // 设置返回按钮 .build();// 初始化图片加载器mGlidImgLoader = new GlideImageLoader();// 初始化监听事件mPauseOnScrollListener = new GlidePauseOnScrollListener(false, true);// 初始化功能配置FunctionConfig.Builder funConBuilder = new FunctionConfig.Builder();// 设置最多可选择5张照图片funConBuilder.setMutiSelectMaxSize;// 设置图片不可编辑funConBuilder.setEnableEdit;// 设置图片不可旋转funConBuilder.setEnableRotate;// 设置图片不可裁剪funConBuilder.setEnableCrop;// 设置不可通过照相选择照片funConBuilder.setEnableCamera;// 设置添加过滤集合,过滤掉之前选中的图片// funConBuilder.setFilter(mPhotoList);// 不过滤图片,而是将之前选中的图片设置为选中状态funConBuilder.setSelected(mPhotoList);// 设置可预览funConBuilder.setEnablePreview;// 功能配置mFunctionConfig = funConBuilder.build();// 初始化核心配置mCoreConfig = new CoreConfig.Builder(ReportActivity.this, mGlidImgLoader, mThemeConfig) .setFunctionConfig(mFunctionConfig) // 添加功能配置 .setPauseOnScrollListener(mPauseOnScrollListener) // 滑动停止加载事件 .setNoAnimcation // 无特效动画 .build();// 实例化GalleryFinalGalleryFinal.init(mCoreConfig);// 多图片选择打开相册GalleryFinal.openGalleryMuti(Constants.REQUEST_CODE_GALLERY, mFunctionConfig, mOnHandlerResultCallback);// 初始化图片加载器initImageLoader(ReportActivity.this);

/** * 初始化图片加载器 * * @param context */private void initImageLoader(Context context) { // 图片加载器配置 ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder; // 设置线程优先级 config.threadPriority(Thread.NORM_PRIORITY - 2); // 禁止内存缓存 config.denyCacheImageMultipleSizesInMemory(); // 设置磁盘缓存文件名生成器 config.diskCacheFileNameGenerator(new Md5FileNameGenerator; // 设置磁盘缓存大小 config.diskCacheSize(20 * 1024 * 1024); // 设置任务进程执行顺序:先进后出 config.tasksProcessingOrder(QueueProcessingType.LIFO); // 调试使用,若是发布版,需要移除代码 config.writeDebugLogs(); // 初始化图片加载器 ImageLoader.getInstance().init(config.build;}
  • 选拔图片重回的回调完成
/** * 回调处理 */private GalleryFinal.OnHanlderResultCallback mOnHandlerResultCallback = new GalleryFinal.OnHanlderResultCallback() { @Override public void onHanlderSuccess(int reqeustCode, List<PhotoInfo> resultList) { // 清除原来列表中的图片 mPhotoList.clear(); // 返回图片列表 mPhotoList.addAll(resultList); // 刷新页面 mPhotoAdapter.notifyDataSetChanged(); } @Override public void onHanlderFailure(int requestCode, String errorMsg) { // 错误提示 Toast.makeText(Activity.this, errorMsg, Toast.LENGTH_SHORT).show(); }};

听别人讲上述代码,可获取效果图如下:

图片 5始于效率图

改正源码

透过运营调整,开掘框架中稍稍效果与利益与必要区别,因而小编爆发了改良源码的主张,总计须求改动的原效劳点如下:

  • 筛选完达到上限数量的图样后,不能再一次回来图片选拔页面

    图片 6慎选图片数量达到上限制时间力所不及进去图片选用页面

  • 无图片选取时,不能够点击浮动按键进行再次来到

    图片 7无图片时无法赶回

  • 无图片接收时,预览按键依旧留存

    图片 8无图片接纳时预览开关依然留存并得以点击

针对以上急需矫正的职能,源码修正如下:

  • 选料图片达到上限照旧能够再次来到图片选用页面因图片选拔页面包车型地铁跳转在openGalleryMuti方法里福寿双全:
// 多图片选择打开相册GalleryFinal.openGalleryMuti(Constants.REQUEST_CODE_GALLERY, mFunctionConfig, mOnHandlerResultCallback);

故此大家来看看openGalleryMuti方法的源码:

图片 9openGalleryMuti方法源码

能够窥见,源码中犹如此三个剖断逻辑:

if (config.getSelectedList() != null && config.getSelectedList > config.getMaxSize { if(callback != null){ callback.onHanlderFailure(requestCode, mCoreConfig.getContext().getString(R.string.select_max_tips)); } return;}

其作用是当选中的图片数量抢先最大值时,重回张开本地图片选拔器失利的提醒消息。之前大家关系,须要中大家实际多展现了一张图纸:

图片 10“添加”图片

且在布置的时候传出的是增多了一张图纸以往的图形列表:

// 不过滤图片,而是将之前选中的图片设置为选中状态funConBuilder.setSelected(mPhotoList);

因而会以致分界面不能够跳转,大家有八个政策:1.将多充裕的图片放到adapter里面管理,adapter外界保持选中图片数量与选择页面传入图片的多少相通2.setSelected传入图片列表以前将mPhotoList移除多出的图样3.注明掉源码中对图纸数量上限的剖断

  • 无图选取时,点击浮动按键能够回去或然有人不解,为什么不点击标题栏的回到开关重临而要点击浮动按键再次回到?其缘由是,若以前自身选用好图片,不过考虑,今后小编不想要采纳的图纸了,此时大家想把图片清空掉,那时须求点击浮动开关,来更新选中图片的列表。想到那是浮动按键的点击事件,所以咱们到源码的GallerySelectActivity中生成开关的事件回调方法中:图片 11变化开关点击事件这段代码仅仅在当选图片的数目大于0的时候才施行操作,所以大家抬高三个尺度,修改后的代码如下:
if (mSelectPhotoList.size { if (!GalleryFinal.getFunctionConfig().isEditPhoto { resultData(mSelectPhotoList); } else { toPhotoEdit(); }} else { // 添加的代码,使未选中图片时也可返回 resultData(mSelectPhotoList);}

图片 12mSelectPhotoList初始化

假造到当选图片的列表在证明时一度初叶化,所以而不是操心图片重返的回调事件传入空指针对象。

  • 未采用图片时不显得预览开关经过构造的id——iv_preview在PhotoSelectActivity中寻找,在refreshSelectCount方法里找到了对预览开关可以知道性的装置:图片 13refreshSelectCount方法源码从源码中得以寓目,预览按键的可知性决断逻辑仅仅与isEnablePreview有关,而尚未和当选的图纸数量实行关联,所以大家更改代码如下:
public void refreshSelectCount() { mTvChooseCount.setText(getString(R.string.selected, mSelectPhotoList.size(), GalleryFinal.getFunctionConfig().getMaxSize; if (mSelectPhotoList.size() > 0 && GalleryFinal.getFunctionConfig().isMutiSelect { mIvClear.setVisibility(View.VISIBLE); if (GalleryFinal.getFunctionConfig().isEnablePreview { mIvPreView.setVisibility(View.VISIBLE); } } else { mIvClear.setVisibility(View.GONE); mIvPreView.setVisibility(View.GONE); }}

入选中图纸列表大小为0的时候,隐蔽预览按键;大于0的时候再依据isEnablePreview(卡塔尔(قطر‎来剖断是或不是出示预览开关。

改革结谈判代码逻辑

布局和代码逻辑的改造,其思路与上一节修正源码同等,因急需的作用图功能与GalleryFinal的效应基本一致,逻辑上并无需做过多的修正,而架构的修改仅涉及到ImageButton产生Button,ImageView产生TextView以至控件地方的调节,在涉及控件上和点击事件依照id来推断事件管理上做相应校正就能够,在这里不做赘述。

总结

行使GalleryFinal订制归于本身的图样采纳器并轻便,只必要循着必要的作用点,依照代码的逻辑一小点追踪源码并拓宽更改订制就可以。老实地说,GalleryFinal框架的可移植性确实很强,在那推荐我们领悟一下!

本篇文章的德姆o已上传Github,迎接访问教导!原创不易,转发请注脚链接:

本文由澳门新莆京娱乐官网发布于编程,转载请注明出处:私人订制Android本地图片选择器

关键词: