Android自定义图片选择器
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;
}
@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中查看
Android自定义图片选择器相关推荐
- Android自定义滚动选择器
Android自定义滚动选择器 实现图片的效果 代码如下 package com.linzihui.widget;import android.annotation.SuppressLint; imp ...
- android 自定义图片,Android自定义图片集合
本文主要包括以下内容: 使用Xfermode设置圆角图片 使用BitmapShader设置圆角图片 滑动旋转缩放的bimp图片 图片颜色处理(滑动) 图片 + 文字 其中1,2是两种不同方式处理图片圆 ...
- ios+html5+选取照片,iOS 自定义图片选择器 1 - PhotoKit
[ 写在前面:笔者按照Instagram的图片选取器写了个小Demo, 该系列文章为笔者实现Demo的步骤,若有不正确的地方还望指出来,共同学习. 地址在最后] iOS开发者对于图片选择器不会感到陌生 ...
- android 自定义图片裁剪,Android图片裁剪工具封装
笔者从零开始开发Android,而且是跳过java直接使用kotlin开发,这其中的好处是可以避开java这门传统语言诸多的潜规则,难处是相比资深Android开发者少了许多可以现用的工具库.比如An ...
- android之图片选择器ImageSelector的使用
一.ImageSelector是什么? Android图片选择器,仿微信的图片选择器的样式和效果.支持图片的单选.限数量的多选和不限数量的多选.支持图片预览和图片文件夹的切换.支持在选择图片时调用相机 ...
- android 自定义图片加载动画效果,Android自定义加载动画-感染体
Android自定义动画系列七,今天来分享第七个自定义Loading动画(InfectionBallBuilder),看上去感觉有种病毒源被感染的感觉,所以名字就叫感染体,这个动画做出来的效果,我不怎 ...
- android自定义图片+文字控件四种实现方法,Android自定义“图片+文字”控件四种实现方法之 二--------个人最推荐的一种...
http://blog.csdn.net/yanzi1225627/article/details/8633872 第二种方法也要新建一个图片+文字的xml布局文件,然后写一个类继承自LinearLa ...
- android自定义图片加载,Android自定义ProgressDialog加载图片
为了提高用户体验,我们肯定希望该Dialog能更加炫酷,让用户看着更舒服.那如何做呢,当然是我们自己定义一个ProgressDialog了. 一.使用系统加载框 mDialog = new Progr ...
- android自定义图片过渡效果,教你做出炫酷的Android动画效果
前言 Android动画也是Android系统中一个很重要的模块, 在平时开发中, 为了做出炫酷的效果, 动画可以说是必不可少的; 本文将总结Android中与动画相关的部分, 文中部分内容整理自文末 ...
最新文章
- 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并
- SAP MM 采购单据的屏幕布局配置中字段选择值“$$$$”有什么用处?
- 三种方法让信息在局域网中自由散发
- C++ stack容器
- python新手入门英文词汇笔记(1-1)_Python新手入门英文词汇(1-1)
- java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...
- 【C#】带等待窗体的BackgroundWorker
- 叮当:一个开源的树莓派中文智能音箱项目
- 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_06maven标准目录结构...
- Atitit 文档全文索引的索引种类 用于文本数据挖掘 搜索 数据分析 目录 1.1. Txt摘要索引。。	1 1.2. File placeholder 索引	1 1.3. Lucence索引	1
- 移动应用开发常见技术比较
- Computer:Microsoft Office Visio2021的简介、安装、使用方法图文教程之详细攻略
- linux 2.6下eeprom at24c08 i2c设备驱动(new style probe方式)
- 视频教程-MMOARPG地下守护神_单机版实战视频课程(中部) -Unity3D
- linux时区文件格式,干货|理解Linux系统的时区、夏令时
- 悬浮窗——判断及跳转(包含OPPO 5.1 系统等)
- 介绍一个开源博客项目并部署到Nginx服务器
- 2、Ubuntu介绍加环境搭建详细教程
- 联想服务器重装系统按什么键,联想重装系统按哪个键
- qlabel 详解
热门文章
- 2021年美容师(初级)考试题及美容师(初级)考试总结
- 芯片验证漫游指南_利用微纳微尺度3D打印技术制备微流控液滴生成芯片
- 构建docker镜像并上传到阿里云仓库
- web无序列表去掉点_无序列表ul标记的type属性值可以为-智慧树Web前端开发技术(山东联盟)章节答案...
- web项目开发 之 前端规范 --- HTML编码规范
- 仿网易云音乐切换主题
- C语言-数组的定义和引用
- 一款搭载恩智浦i.MX 8M Plus处理器的国产核心板正式发布
- 致全国所有参加比赛坚持到今天的人
- Option Tracing: Beyond Correctness Analysis in Knowledge Tracing