Android制作微信添加多个图片,放大图片
1.添加依赖
implementation 'com.github.bumptech.glide:glide:4.12.0' //裁剪图片等等 implementation 'androidx.recyclerview:recyclerview:1.1.0' //recycleview依赖
2.使用recycleview
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="wrap_content" />
3.编写两个item页面为recycleview的子页面
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/btnAdd"android:layout_width="100dp"android:layout_height="120dp"android:layout_margin="4dp"android:layout_weight="1"android:text="Add"/>
//点击添加按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="8dp"><ImageViewandroid:id="@+id/imgView"android:layout_width="100dp"android:layout_height="100dp"/></LinearLayout>
4.写recycleview的适配器
package com.example.myapplication;import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.bumptech.glide.Glide;import java.util.ArrayList;public class ImageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private final int VIEW_TYPE_IMAGE = 0;private final int VIEW_TYPE_ADD_BUTTON = 1;private ArrayList<Uri> imageUris;private Context context;private LayoutInflater inflater;private OnAddButtonClickListener addButtonClickListener;public interface OnAddButtonClickListener {void onAddButtonClick();}public ImageAdapter(Context context, OnAddButtonClickListener listener) {this.context = context;this.imageUris = new ArrayList<>();this.inflater = LayoutInflater.from(context);this.addButtonClickListener = listener;}public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {if (viewType == VIEW_TYPE_IMAGE) {View itemView = inflater.inflate(R.layout.iteam, parent, false);return new ImageViewHolder(itemView);} else {View itemView = inflater.inflate(R.layout.iteambutton, parent, false);Button addButton = itemView.findViewById(R.id.btnAdd);addButton.setOnClickListener(v -> addButtonClickListener.onAddButtonClick());return new AddButtonViewHolder(itemView);}}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if (getItemViewType(position) == VIEW_TYPE_IMAGE) {Uri uri = imageUris.get(position);ImageViewHolder imageHolder = (ImageViewHolder) holder;Glide.with(context).load(uri).centerCrop().into( imageHolder.imageView);//点击图片 放大图片,跳转页面imageHolder.imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(context,emptyActivity.class);intent.putExtra("url",uri.toString());context.startActivity(intent);}});}}@Overridepublic int getItemCount() {// Plus one for the add buttonreturn imageUris.size() + 1}@Overridepublic int getItemViewType(int position) {return position == imageUris.size() ? VIEW_TYPE_ADD_BUTTON : VIEW_TYPE_IMAGE;}public void addImage(Uri uri) {imageUris.add(uri);notifyItemInserted(imageUris.size() - 1);}static class ImageViewHolder extends RecyclerView.ViewHolder {ImageView imageView;ImageViewHolder(View itemView) {super(itemView);imageView = itemView.findViewById(R.id.imgView);}}static class AddButtonViewHolder extends RecyclerView.ViewHolder {AddButtonViewHolder(View itemView) {super(itemView);}}
}
5.编写java文件
package com.example.myapplication;import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import java.util.ArrayList;public class RecyCleActivity extends AppCompatActivity implements ImageAdapter.OnAddButtonClickListener{private static final int REQUEST_CODE_PICK_IMAGE = 1;private ImageAdapter imageAdapter;private RecyclerView recyclerView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_recy_cle);recyclerView = findViewById(R.id.recyclerView);recyclerView.setLayoutManager(new GridLayoutManager(this,3));imageAdapter = new ImageAdapter(this, this);recyclerView.setAdapter(imageAdapter);}@Overridepublic void onAddButtonClick() {Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);}protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK) {if (data != null) {Uri selectedImageUri = data.getData();if (selectedImageUri != null) {imageAdapter.addImage(selectedImageUri);}}}}
}
6.编写点击图片后放大图片,创建emptyActivity页面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:id="@+id/img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"/></RelativeLayout>
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;import com.bumptech.glide.Glide;import javax.microedition.khronos.opengles.GL;public class emptyActivity extends AppCompatActivity {private ImageView img;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_empty);img=findViewById(R.id.img);String imageUriString = getIntent().getStringExtra("url");Glide.with(emptyActivity.this).load(imageUriString).into(img);}
}
相关文章:
Android制作微信添加多个图片,放大图片
1.添加依赖 implementation com.github.bumptech.glide:glide:4.12.0 //裁剪图片等等 implementation androidx.recyclerview:recyclerview:1.1.0 //recycleview依赖 2.使用recycleview <androidx.recyclerview.widget.RecyclerViewandroid:id"id/recyclerView"…...
iOS runtime理解和应用场景
一、runtime的动态性 OC的运行时系统(Runtime System)提供了丰富的动态特性,包括类与对象的创建、消息发送与转发、方法的动态添加与替换、属性的动态合成等。通过使用运行时库提供的API,可以在运行时获取和操作类与对象的信息,实现各种动态性的功能。 我对 Runtime 的理…...
画图实战-Python实现某产品全年销量数据多种样式可视化
画图实战-Python实现某产品全年销量数据多种样式可视化 学习心得Matplotlib说明什么是Matplotlib?Matplotlib特性Matplotlib安装 产品订单量-折线图某产品全年订单量数据数据提取和分析绘制折线图 产品订单&销售额-条形图某产品全年订单&销售额数据绘制条形…...
YOLOv9详解
1.概述 在逐层进行特征提取和空间转换的过程中,会损失大量信息,例如图中的马在建模过程中逐渐变得模糊,从而影响到最终的性能。YOLOv9尝试使用可编程梯度信息PGI解决这一问题。 具体来说, PGI包含三个部分,࿰…...
CRON 定时任务
检测是否安装了 cron systemctl status crond 如果没有安装使用 sudo yum install cronie 编辑 crontab -e * * * * * php /path/your.php Esc键 然后输入 :q 退出 :wq 保存并退出 第一个 * 表示分钟,表示每分钟执行一次。第二个 * 表示小时,表示每…...
环境安装篇 之 Kind 搭建 kubernetes 测试集群
云原生学习路线导航页(持续更新中) 本文是 环境安装 系列文章,介绍 使用Kind工具 快速安装 kubernetes 测试集群的详细步骤 1.Kind简介 Kind 是一个使用 Docker 容器“节点”运行本地 Kubernetes 集群的工具。Kind 主要用于测试kubernetes本…...
每日五道java面试题之mybatis篇(四)
目录: 第一题. 映射器#{}和${}的区别第二题. 模糊查询like语句该怎么写?第三题. 在mapper中如何传递多个参数?第四题. Mybatis如何执行批量操作第五题 MyBatis框架适用场景 第一题. 映射器#{}和${}的区别 #{}是占位符,预编译处理;${}是拼接…...
camunda流程引擎的插件如何使用
camunda工作流引擎是一个开放的架构,除了流程引擎默认提供的功能外,开发者可以通过流程插件机制,对流程引擎功能进行扩展。即流程引擎插件是流程引擎配置的扩展。插件必须提供 ProcessEnginePlugin 接口的实现。 下面以全局任务事件监听器为…...
Vue打包问题汇总:legacy、runtime.js
问题一:Vue3.x的版本中build后dist文件中出现legacy的js文件 解决办法是添加兼容的浏览器 package.json "browserslist": ["> 1%","last 2 versions","not dead","not ie 11" ]参考 Vue3.x的版本中build后…...
挑战杯 车位识别车道线检测 - python opencv
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) …...
c++面经
1. 僵尸进程 僵尸进程(Zombie Process)在操作系统中指的是那些已经执行完毕,但其父进程尚未对其进行善后处理(例如读取子进程的状态信息或者执行回收资源的操作)的进程。在Unix和类Unix系统࿰…...
js中副作用的消除还解决了并行计算带来的竞争问题,具体是如何解决的
在JavaScript中,副作用是指对外部环境产生的可观察的变化,例如修改全局变量、修改DOM元素等。副作用的存在可能导致代码的可维护性和可测试性下降,并且在并行计算中可能引发竞争问题。 不纯的函数有可能访问同一块资源,如果先后调…...
3/14/24数据结构、线性表
目录 数据结构 数据结构三要素 逻辑结构 存储结构 数据运算 时间复杂度 空间复杂度 线性表 线性表定义 静态分配 动态分配 线性表插入 线性表删除 十天的时间学完了C语言督学课程,最后终于是可以投入到408的科目学习当中。关于数据结构和算法的学习很多部…...
软件测试面试200问,面试看这就够了。。。
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我…...
力扣● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇
● 583. 两个字符串的删除操作 注意审题: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 删除最少的字符使两者相同,说明留下来的就是最大公共子序列。不要求…...
Git速成
文章目录 Git 分布式版本控制工具课程内容1. 前言1.1 什么是Git1.2 使用Git能做什么 2. Git概述2.1 Git简介2.2 Git下载与安装 3. Git代码托管服务3.1 常用的Git代码托管服务3.2 码云代码托管服务3.2.1 注册码云账号3.2.2 登录码云3.2.3 创建远程仓库3.2.4 邀请其他用户成为仓库…...
一文看懂softmax loss
文章目录 softmax loss1.softmax函数2.交叉熵损失函数3.softmax loss损失函数(重点)4.带有temperature参数的softmax loss参考 softmax loss 1.softmax函数 softmax函数是一种常用的激活函数,通常用于多分类任务中。给定一个向量࿰…...
用C语言链表实现图书管理
#include <stdio.h> #include <stdlib.h> #include <string.h> struct ListNode {int val;//编号char title[50];//书名float price;//价格struct ListNode* next; };// 在尾部插入节点 struct ListNode* insertAtTail(struct ListNode* head, int val,char …...
Hello,Spider!入门第一个爬虫程序
在各大编程语言中,初学者要学会编写的第一个简单程序一般就是“Hello, World!”,即通过程序来在屏幕上输出一行“Hello, World!”这样的文字,在Python中,只需一行代码就可以做到。我们把这第一个爬虫就称之为“HelloSpider”&…...
AI实景无人自动直播间怎么搭建?三步教你轻松使用
最近很多朋友看到AI自动直播带货玩法,也想开启自己的自动直播间,但还是有些问题比较担心,这种自动讲解、自动回复做带货的直播间是不是很麻烦? 实景无人自动直播 实际上这种直播间搭建相当简单便捷!今天跟着笔者&…...
SegFormer源码解读:从注意力机制到特征融合的实现细节
SegFormer源码解读:从注意力机制到特征融合的实现细节 【免费下载链接】SegFormer Official PyTorch implementation of SegFormer 项目地址: https://gitcode.com/gh_mirrors/se/SegFormer SegFormer是一个基于Transformer的语义分割模型,它通过…...
C++实战:用代码构建你的斗罗大陆武魂觉醒系统
1. 从零开始搭建武魂觉醒系统 第一次看到斗罗大陆的武魂觉醒桥段时,我就被这个充满想象力的设定吸引了。作为程序员,我总忍不住思考:如果用代码实现这个系统会怎样?去年带新人培训时,我尝试用C还原了这个过程ÿ…...
【chat】Verilog命名规范实战指南:从文件到模块的优雅编码
1. Verilog命名规范的重要性 刚开始接触Verilog的时候,我总觉得命名规范是个可有可无的东西。直到有一次接手同事的代码,看到一堆乱七八糟的命名,才深刻体会到规范的重要性。那感觉就像走进一个没有标签的仓库,想找什么都得一个个…...
UniApp项目实战:用UTS插件实现安卓后台保活(附完整Service配置与权限处理)
UniApp安卓后台保活实战:UTS插件与Service优化全解析 在移动应用开发中,后台任务保活一直是开发者面临的棘手问题。想象一下:你的UniApp应用需要持续获取用户位置、实时推送消息或播放音乐,却频繁被系统清理,用户体验直…...
Modbus转EtherCAT网关开发秘笈:用AX58100实现120个命令自动映射(Web配置全图解)
Modbus转EtherCAT网关开发实战:AX58100零代码配置与工业部署全指南 工业自动化领域正经历着从传统串行通信向实时以太网协议的转型浪潮。作为这场变革的核心枢纽,协议转换网关的性能直接决定了整个系统的响应速度和稳定性。本文将深入探讨如何利用AX5810…...
gitru:一个由 Rust 打造的零依赖 Git 提交信息校验工具
gitru 基于 Git 的 commit-msg Hook 实现,用于在提交阶段自动校验提交信息格式。 在团队协作开发中,规范的 Git 提交信息是代码追溯、版本管理、自动生成变更日志的基础。 但现实往往是: 人工约束容易遗漏手动配置 Hook 繁琐提交信息格式随心…...
YOLO X Layout与Python结合实战:自动化文档结构解析应用
YOLO X Layout与Python结合实战:自动化文档结构解析应用 1. 项目背景与价值 在日常工作中,我们经常会遇到大量需要处理的文档——扫描的合同、电子发票、研究报告、技术文档等等。传统的人工处理方式不仅效率低下,还容易出错。想象一下&…...
OpenClaw私有化方案:Qwen3-VL:30B+飞书自动化助手实战
OpenClaw私有化方案:Qwen3-VL:30B飞书自动化助手实战 1. 为什么选择私有化AI助手 去年我接手了一个特殊项目:需要将公司内部的技术文档自动整理成知识库,并推送到飞书文档。这个需求看似简单,但涉及几个棘手问题:文档…...
OpenClaw+nanobot自动化测试:24小时监控网站可用性
OpenClawnanobot自动化测试:24小时监控网站可用性 1. 为什么需要自动化网站监控 作为个人站长,我经常遇到这样的困扰:半夜网站突然宕机,直到第二天收到用户反馈才发现问题。传统监控方案要么价格昂贵,要么配置复杂&a…...
从Proteus仿真到普中开发板烧录:51单片机抢答器完整开发流程避坑指南
从Proteus仿真到普中开发板烧录:51单片机抢答器完整开发流程避坑指南 在电子设计的学习道路上,51单片机项目开发是一个经典的入门实践。抢答器作为典型的互动式电子系统,涵盖了输入检测、逻辑控制、显示输出等核心知识点,是检验学…...
