1.前言

随着APP功能的全面化,越来越多的应用都开发了类似微信朋友圈的功能,随时随地分享自己的心情,图片视频!当需要上传图片、视频的时候,就需要一个图片、视频资源选择器,所以接下来将自己实现一个简单的图片选择器。

2.实现思路

①通过contentResolver获取手机中的图片、视频文件,也可以直接拍摄,这个时候不会重新获取手机里的资源(既然把拍的都删除了,还查询出来干嘛)。

②定义一个全局集合,用来存放选中的图片和视频,并用一个变量来表示是视频还是图片。

③将查询出来的图片全部显示的时候,需要防止内存溢出,这是用来一个网上的优化工具类,挺好用的。

④当选择好图片的时候,只需要在Activity显示出选择的集合就可以了。

⑤自定义ImageView实现图片放大缩小,以及解决与Viewpager的滑动冲突

3.效果图

详细的功能实现看下面的效果图片,本来想上传gif图的,但是限制只能上传2M,所以上传不了,这里就截图表示一下,具体的实现效果gif图和源代码将在git中展示。

4.功能代码

①contentResolver获取手机资源代码。

/**

* 获取手机中的所有图片

*/

public ArrayList<SelectFileBean> getAllImage() {

if (imagelist !=null)

return imagelist;

imagelist = new ArrayList<>();

String[] project = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA};

Cursor query = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, project,null,null,null);

if (query.moveToFirst()) {

int dataColumn = query.getColumnIndex(MediaStore.Images.Media.DATA);

do {

SelectFileBean bean = new SelectFileBean();

bean.setFile_path(query.getString(dataColumn));

bean.setImage(true);

imagelist.add(bean);

} while (query.moveToNext());

}

return imagelist;

}

/**

* 获取手机中所有的视频

*

* @return

*/

public ArrayList<SelectFileBean> getAllVedio() {

if (videolist !=null)

return videolist;

videolist = new ArrayList<>();

String[] project = new String[]{MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA};

Cursor cs = cr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, project,null,null,null);

if (cs.moveToFirst()) {

int dataColum = cs.getColumnIndex(MediaStore.Video.Media.DATA);

do {

SelectFileBean bean = new SelectFileBean();

bean.setFile_path(cs.getString(dataColum));

bean.setImage(false);

videolist.add(bean);

} while (cs.moveToNext());

}

return videolist;

}

②在图片预览界面,自定义RelativeLayout,是图片显示正方形

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

//设置自己测量的结果

setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec));

//测量子view

int measuredWidth = getMeasuredWidth();

widthMeasureSpec = MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY);

heightMeasureSpec = widthMeasureSpec;

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

③将指定路径的图片转换成bitmap

/**

* 将文件路径的图片转换成bitmap

*

* @param path

* @return

* @throws IOException

*/

public static Bitmap revitionImageSize(String path) throws IOException {

if (path == null) {

return null;

}

BufferedInputStream in = new BufferedInputStream(new FileInputStream(

new File(path)));

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeStream(in, null, options);

in.close();

int i = 0;

Bitmap bitmap = null;

while (true) {

if ((options.outWidth >> i <= 1000)

&& (options.outHeight >> i <= 1000)) {

in = new BufferedInputStream(

new FileInputStream(new File(path)));

options.inSampleSize = (int) Math.pow(2.0D, i);

options.inJustDecodeBounds = false;

bitmap = BitmapFactory.decodeStream(in, null, options);

break;

}

i += 1;

}

return bitmap;

}

④自定义ImageView实现放大缩小,以及解决滑动冲突的代码由于比较多,这里就不贴出来,可以移步到github中查看

5.项目源码: github地址

Android自定义图片选择器相关推荐

  1. Android自定义滚动选择器

    Android自定义滚动选择器 实现图片的效果 代码如下 package com.linzihui.widget;import android.annotation.SuppressLint; imp ...

  2. android 自定义图片,Android自定义图片集合

    本文主要包括以下内容: 使用Xfermode设置圆角图片 使用BitmapShader设置圆角图片 滑动旋转缩放的bimp图片 图片颜色处理(滑动) 图片 + 文字 其中1,2是两种不同方式处理图片圆 ...

  3. ios+html5+选取照片,iOS 自定义图片选择器 1 - PhotoKit

    [ 写在前面:笔者按照Instagram的图片选取器写了个小Demo, 该系列文章为笔者实现Demo的步骤,若有不正确的地方还望指出来,共同学习. 地址在最后] iOS开发者对于图片选择器不会感到陌生 ...

  4. android 自定义图片裁剪,Android图片裁剪工具封装

    笔者从零开始开发Android,而且是跳过java直接使用kotlin开发,这其中的好处是可以避开java这门传统语言诸多的潜规则,难处是相比资深Android开发者少了许多可以现用的工具库.比如An ...

  5. android之图片选择器ImageSelector的使用

    一.ImageSelector是什么? Android图片选择器,仿微信的图片选择器的样式和效果.支持图片的单选.限数量的多选和不限数量的多选.支持图片预览和图片文件夹的切换.支持在选择图片时调用相机 ...

  6. android 自定义图片加载动画效果,Android自定义加载动画-感染体

    Android自定义动画系列七,今天来分享第七个自定义Loading动画(InfectionBallBuilder),看上去感觉有种病毒源被感染的感觉,所以名字就叫感染体,这个动画做出来的效果,我不怎 ...

  7. android自定义图片+文字控件四种实现方法,Android自定义“图片+文字”控件四种实现方法之 二--------个人最推荐的一种...

    http://blog.csdn.net/yanzi1225627/article/details/8633872 第二种方法也要新建一个图片+文字的xml布局文件,然后写一个类继承自LinearLa ...

  8. android自定义图片加载,Android自定义ProgressDialog加载图片

    为了提高用户体验,我们肯定希望该Dialog能更加炫酷,让用户看着更舒服.那如何做呢,当然是我们自己定义一个ProgressDialog了. 一.使用系统加载框 mDialog = new Progr ...

  9. android自定义图片过渡效果,教你做出炫酷的Android动画效果

    前言 Android动画也是Android系统中一个很重要的模块, 在平时开发中, 为了做出炫酷的效果, 动画可以说是必不可少的; 本文将总结Android中与动画相关的部分, 文中部分内容整理自文末 ...

最新文章

  1. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并
  2. SAP MM 采购单据的屏幕布局配置中字段选择值“$$$$”有什么用处?
  3. 三种方法让信息在局域网中自由散发
  4. C++ stack容器
  5. python新手入门英文词汇笔记(1-1)_Python新手入门英文词汇(1-1)
  6. java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...
  7. 【C#】带等待窗体的BackgroundWorker
  8. 叮当:一个开源的树莓派中文智能音箱项目
  9. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_06maven标准目录结构...
  10. Atitit 文档全文索引的索引种类 用于文本数据挖掘 搜索 数据分析 目录 1.1. Txt摘要索引。。 1 1.2. File placeholder 索引 1 1.3. Lucence索引 1
  11. 移动应用开发常见技术比较
  12. Computer:Microsoft Office Visio2021的简介、安装、使用方法图文教程之详细攻略
  13. linux 2.6下eeprom at24c08 i2c设备驱动(new style probe方式)
  14. 视频教程-MMOARPG地下守护神_单机版实战视频课程(中部) -Unity3D
  15. linux时区文件格式,干货|理解Linux系统的时区、夏令时
  16. 悬浮窗——判断及跳转(包含OPPO 5.1 系统等)
  17. 介绍一个开源博客项目并部署到Nginx服务器
  18. 2、Ubuntu介绍加环境搭建详细教程
  19. 联想服务器重装系统按什么键,联想重装系统按哪个键
  20. qlabel 详解

热门文章

  1. 2021年美容师(初级)考试题及美容师(初级)考试总结
  2. 芯片验证漫游指南_利用微纳微尺度3D打印技术制备微流控液滴生成芯片
  3. 构建docker镜像并上传到阿里云仓库
  4. web无序列表去掉点_无序列表ul标记的type属性值可以为-智慧树Web前端开发技术(山东联盟)章节答案...
  5. web项目开发 之 前端规范 --- HTML编码规范
  6. 仿网易云音乐切换主题
  7. C语言-数组的定义和引用
  8. 一款搭载恩智浦i.MX 8M Plus处理器的国产核心板正式发布
  9. 致全国所有参加比赛坚持到今天的人
  10. Option Tracing: Beyond Correctness Analysis in Knowledge Tracing