当前位置: 首页 > 科技观察

Android-如何开发一个强大的图片选择器

时间:2023-03-16 16:40:36 科技观察

图片选择器是Android开发中经常用到的一个功能,尤其是社交应用,比如头像设置,比如发图片。自然地,ImagePicker有很多轮子。今天给大家介绍一个强大的转轮SImagePickerhttps://github.com/martin90s/ImagePickerIntroduction首先强大的功能首先是基本的图片读取展示,图片更新监控超大图片预览,比如一张19M,10000*5000px图片裁剪功能丰富的可配置项,支持图片选择,选择数量定义,支持选择图片过滤,支持多种图片加载器(Fresco,Glide等)第一张图片模式,第二张选择多张图片(包括动画和平滑跳转),第三张图加载超大图(19.5M,10000*5000px)图片模式,支持裁剪多选图片,平滑页面跳转和超大图预览,可以看看如何使用渐变加载1.首先初始化(建议在Application的oncreate中调用)SImagePicker.init(newPickerConfig.Builder().setAppContext(this).setImageLoader(newFrescoImageLoader()).setToolbaseColor(getColor(R.color.colorPrimary)).build());2、调用SImagePicker.from(MainActivity.this).maxCount(9).rowCount(3).pickMode(SImagePicker.MODE_IMAGE).fileInterceptor(newSingleFileLimitInterceptor()).forResult(REQUEST_CODE_IMAGE);配置项1.全局配置(即,初始化时传入的PickerConfig,此配置应用于SImagePicker的整个使用)配置参数parametermeaningsetImageLoader(ImageLoader)使用的Imageloader。演示项目中实现了两个ImageLoader,Fresco和Glide。可以参考setToolbarColor(int)Picker的主色。默认值为App的primaryColor。setAppContext(Context)可以将Picker内部使用的Context传递给ApplicationContext。(即每次调用SImagePicker时传入的参数,该参数只对本次调用有效)在onActivityResult()返回,现在返回的结果有两个值,用户选中图片的路径列表data.getStringArrayListExtra(PhotoPickerActivity.EXTRA_RESULT_SELECTION);用户是否选择了原图data.getBooleanExtra(PhotoPickerActivity.EXTRA_RESULT_ORIGINAL,false);maxCount(int)本次选择允许的最大选择数,默认为1。比如你选择最多9张图片发朋友圈,则可以发送9张。rowCount(int)显示多少张图片图片列表单行setSelected(List)PickMode默认选中的图片(int)图片选择的模式,现在有两种模式:头像模式和普通模式,头像模式是选中的选择图片后,默认跳转到图片裁剪页面,默认只能选择一张。cropFilePath(String)头像模式裁剪图片存储地址showCamera(boolen)是否显示照片入口右下角显示的文字信息pickText(int)(例如配置选择、发送、完成)fileInterceptor(FileChooseInterceptor)图片过滤,比如用户选择的单张图片大小有限制,可以写在这个拦截器中,当用户选择的图片过大时,可以提示过滤forResult(intrequestCode)打开图片selector,在调用图片选择器的Fragment或Activity中传入requestCode获取result=REQUEST_CODE_IMAGE){finalArrayListpathList=data.getStringArrayListExtra(PhotoPickerActivity.EXTRA_RESULT_SELECTION);finalbooleanoriginal=data.getBooleanExtra(PhotoPickerActivity.EXTRA_RESULT_ORIGINAL,false);}}实现读取Curso图片库rLoaderAndroid3.0引入了加载器/加载器(Loader)的功能,主要用于异步加载数据库加载器。Loader的特点:loader提供加载异步数据的能力。加载程序监视数据资源并在内容更改时发送。新结果;配置更改后重建时,加载程序会自动重新连接到最后一个加载程序游标,因此无需重新查询数据。本项目也使用loader来加载和监控图像数据。Photo和Album分别有一个loader和一个controller,分别是图片和相册。loader主要用于加载相应的数据,controller主要用于读取数据后刷新加载的数据。发布。源码中对应的PhotoLoader初始化minSize+""},ORDER_BY);}returnnewPhotoLoader(context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI,PROJECTION,MediaStore.Images.Media.BUCKET_ID+"=?and("+SELECTION_SIZE+")",newString[]{album.getId(),minSize+""},ORDER_BY);}超大图片加载如何显示超大图片是个难题,比如这张图http://7xpb9x.com1.z0.glb.clouddn.com/2017/01/20/b578e4755a32ac56a9c4b9a1f7e2822d.jpg10000*5000像素,接近20M。这种图片不能一下子全部载入内存。你可以计算一下,即使把RGB_565方法加载到内存中,也差不多要占用90M的内存,这显然是不可能的。你可以回头看看第三个演示gif。显然,当用户打开一张图片时,默认是不需要看到细节的。当用户点击某个区域进行放大时,需要该区域的清晰图片。所以这种超大图怎么显示的思路基本上就是先获取文件路径,读取图片的宽高,根据屏幕和图片的宽高计算出一个展示全图的Samplesizeheight,根据这个值加载创建全景图片,将图片分块。block会分隔出不同放大倍率下的block列表(即选择不同的SampleSize)。比如放大2倍时,放大4倍时,如何划分块当用户点击放大某个区域时,根据放大倍数和当前中心点选择对应的块进行加载和渲染。SImagePicker项目中主要使用了subsamplingImageView,并根据picker的需要进行了一些修改,实现了超大图的预览图列表显示。说明因为使用了cursorLoader,ListView可以使用CursorAdapter,但是RecyclerView没有对应的Adapter,所以在源码中可以看到实现了一个RecycleCursorAdapter,用于实现自动刷新从游标中获取的数据。兼容性为了兼容多种图片加载器,SImagePicker抽象出一个ImageLoader接口,允许用户自定义对应的图片加载器。使用建议SImagePicker在jitpack上提供了依赖库,可以快速对接业务。但是,由于大部分APP对ImagePicker的使用都有各种各样的业务需求,而SImagePicker只是抽象了一些常用的配置,使用为了让用户能够快速集成,建议用户尽量以源码参考的方式使用SImagePicker可能的。这是一本好书,因为它本身并不复杂。