Android自定义组件获取本地图片和相机拍照图片
发布时间 - 2026-01-10 22:35:03 点击率:次iOS中有封装好的选择图片后长按出现动画删除效果,效果如下

而Android找了很久都没有找到有这样效果的第三方组件,最后懒得找了还是自己实现这效果吧
选择图片后还可对图片进行剪裁
当然,代码中还有很多不完善的地方,我接下来会继续完善这个组件的
已经上传到开源社区,欢迎大家来Star啊~
Demo源码:传送门
设计中的碰到的一些问题和解决思路
1.如何让加号图片显示在GridView最后面
首先在调用GridAdapter构造方法时就加载加号图片
/**
* 图片适配器
* @param context 上下文
* @param imagesum 最大可添加图片数
*/
public GridAdapter(Context context, int imagesum) {
this.context = context;
this.imageSum = imagesum;
// 加号图片
mAddBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_add_image);
}
然后在getCount()方法里对图片数据集合加1,在该位置上添加加号图片
@Override
public int getCount() {
// 数据集合加一,在该位置上添加加号
return imageItemData == null ? 0 : imageItemData.size() + 1;
}
最后在getView()方法中,每次显示图片时都对数据集合中的元素数量进行判断,如果数据集合的数量大于position,则表示需要显示加号图片
if (imageItemData != null && imageItemData.size() > position) {
// 正常图片
} else {
// 加号图片
}
这样就能保证加号图片一直在GridView最后一个item上
2.如何显示出删除按钮
在item布局时,在图片的右上角覆盖一层删除按钮,在Adapter中对这个图片的显示和隐藏进行处理
/** 判断是否显示清除按钮 true=显示 */
private boolean showImageClear = false;
//对外提供显示和隐藏的方法
/**
* 设置图片显示状态
* @param clear 图片状态
*/
public void setClearImgShow(boolean clear) {
showImageClear = clear;
}
/**
* 图片显示状态
* @return 状态 true=显示
*/
public boolean getClearImgShow() {
return showImageClear;
}
删除按钮默认不显示,当用户长按图片时就显示出来
// 长按显示删除按钮
mGridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (!(position == gridAdapter.imageItemData.size())) {
// 如果删除按钮已经显示了则不再设置
if (!gridAdapter.getClearImgShow()) {
gridAdapter.setClearImgShow(true);
gridAdapter.notifyDataSetChanged();
}
}
// 返回true,停止事件向下传播
return true;
}
});
这里需要拦截长按点击事件,把返回值设置为true,因为我们还设置了点击事件的监听,如果不拦截事件,那么长按事件结束后还会同时执行单击事件
最后关键的一点,在GridAdapter类中的getView方法里进行控制,通过getClearImgShow方法获取删除图片是否需要显示,如果返回为true则显示出来,并获取动画实例,让图片开始执行动画效果
if (imageItemData != null && imageItemData.size() > position) {
// 正常显示
// 判断是否需要显示删除按钮 ,为true则显示,并执行动画效果
if (getClearImgShow()) {
holder.imgclear.setVisibility(View.VISIBLE);
CustomRotateAnim anim = CustomRotateAnim.getCustomRotateAnim();
anim.setDuration(300);
anim.setRepeatCount(2);
anim.setInterpolator(new LinearInterpolator()); // 设置为匀速
holder.img.startAnimation(anim);
} else {
// 关闭动画,隐藏删除按钮
holder.img.clearAnimation();
holder.imgclear.setVisibility(View.GONE);
}
holder.img.setImageBitmap(PhotoBitmapUtil.getCompressPhoto(imageItemData.get(position)));
} else {
......省略......
}
3.如何设置当图片达到最大数时,隐藏加号按钮
在使用GridAdapter的时候,调用方需要传入一个最大图片数:
gridAdapter = new GridAdapter(MainActivity.this, 8); mGridView.setAdapter(gridAdapter);
然后在GridAdapter中接收这个最大图片数,并在getView()方法中对加号图片的显示进行管控
if (imageItemData != null && imageItemData.size() > position) {
// 显示选择的图片
......省略......
} else {
// 显示加号按钮
// 图片数达到最大限制时隐藏加号图片
if (imageItemData.size() != imageSum) {
holder.imgclear.setVisibility(View.GONE); // 不显示删除按钮
holder.img.clearAnimation(); // 去除动画
holder.img.setImageBitmap(mAddBitmap);
}
}
“gridAdapter.getCount() - 1”是因为我们在添加加号图片时加了1,所以使用时需要减1
// 点击图片
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 如果单击时删除按钮处在显示状态,则隐藏它
if (gridAdapter.getClearImgShow()) {
gridAdapter.setClearImgShow(false);
gridAdapter.notifyDataSetChanged();
} else {
if (gridAdapter.getCount() - 1 == position) {
// 判断是否达到了可添加图片最大数
if (!(gridAdapter.imageItemData.size() == gridAdapter.imageSum)) {
selectPhoto.showPopupSelect(mGridView);
}
} else {
popupViewGridPhoto(position);
}
}
}
});
4.如何降低图片加载时的内存消耗量
要在GridView中显示那么多的图片,肯定是需要多图片进行压缩处理的,不然很容易出现OOM错误
这里通过质量压缩,降低加载图片的内存大小
/**
* 把原图按1/5的比例压缩
*
* @param path 原图的路径
* @return 压缩后的图片
*/
public static Bitmap getCompressPhoto(String path) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 5; // 图片的长宽设置为原来的五分之一
Bitmap bmp = BitmapFactory.decodeFile(path, options);
options = null;
return bmp;
}
也可以通过其它的方式,可以参考这篇博客《Android避免内存溢出(Out of Memory)方法总结》
5.如何防止部分手机拍照后图片被旋转的问题
在测试中,部分三星手机拍摄完照片后会把图片旋转90度,这个设计实在是坑,为此还得专门为了这个问题进行处理,每次拍摄完照片后都要获取图片的旋转角度,如果图片被旋转了的话就再旋转回去
可以参考这篇博客
《Android 解决部分手机拍照后获取的图片被旋转的问题》
6.如何让图片左右摇摆
想要实现图片左右摇摆的效果,需要我们自定义Animation
可参看这篇博客
《Android 自定义Animation实现View摇摆效果》
这里就先介绍这么多,详细的解释代码注释中都有的,就不再多说啦
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android自定义组件获取本地图片
# Android获取本地图片
# Android获取相机拍照图片
# Android组件Glide实现图片平滑滚动效果
# Android中ViewPager组件的基本用法及实现图片切换的示例
# android Gallery组件实现的iPhone图片滑动效果实例
# Jetpack Compose图片组件使用实例详细讲解
# 这篇
# 设置为
# 判断是否
# 找了
# 加载
# 自定义
# 时就
# 中对
# 单击
# 博客
# 左右摇摆
# 是因为
# 手机拍照
# 都要
# 就能
# 还会
# 这么多
# 那么多
# 中有
# 很久
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何将凡科建站内容保存为本地文件?
如何用腾讯建站主机快速创建免费网站?
如何快速搭建个人网站并优化SEO?
Android利用动画实现背景逐渐变暗
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
JavaScript Ajax实现异步通信
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何在阿里云虚拟主机上快速搭建个人网站?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
5种Android数据存储方式汇总
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
JavaScript如何操作视频_媒体API怎么控制播放
大连 网站制作,大连天途有线官网?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
浅谈Javascript中的Label语句
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
使用Dockerfile构建java web环境
北京专业网站制作设计师招聘,北京白云观官方网站?
如何在万网自助建站平台快速创建网站?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel如何处理CORS跨域请求?(配置示例)
在Oracle关闭情况下如何修改spfile的参数
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
清除minerd进程的简单方法
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何在宝塔面板中创建新站点?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
如何在景安云服务器上绑定域名并配置虚拟主机?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
微信推文制作网站有哪些,怎么做微信推文,急?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何用景安虚拟主机手机版绑定域名建站?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Laravel API资源类怎么用_Laravel API Resource数据转换
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】

