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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python使用】嘿马头条完整开发md笔记第2篇:数据库,作用【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;课程简介&#xff0c;ToutiaoWeb虚拟机使用说明&#xff0c;Pycharm远程开发&#xff0c;产品与开发&#xff0c;数据库1 产品介绍,2 原型图与UI图,3 技术架构,4 开发。OS…

【 React 】Real DOM 和Virtual DOM的区别?优缺点?

1. 是什么 Real DOM,真实DOM ,意思为文档对象模型&#xff0c;是一个结构化文本的抽象&#xff0c;在页面渲染出的每一个结点都是一个真实DOM结构&#xff0c;如下&#xff1a; <div id"root"><h1>Hello World</h1> </div>Virtual Dom,本质…

SSL证书过期不更新会有什么影响?怎么续签?

SSL证书如果不及时更新&#xff0c;可能会带来以下问题&#xff1a; 1.影响体验和信誉&#xff1a; - 如果你的网站SSL证书过期了&#xff0c;现在大部分浏览器都会提醒用户这个网站的安全证书已经失效。这就很可能让用户觉得你的网站不太安全&#xff0c;不敢继续浏览&#x…

node后端helmet中间件

认识helmet helmet 是一个 Node.js 的中间件&#xff0c;用于增强 Web 应用程序的安全性。它通过设置各种 HTTP 头来增加安全性&#xff0c;以防止一些常见的攻击。 作用 以下是一些 helmet 中间件可以帮助你处理的安全问题&#xff1a; 设置 HTTP 头部&#xff1a; helmet …

mysql判断一个字符串字段的长度是否为0

LENGTH(str) &#xff1a;返回字符串 str 所占用的字节数。 CHAR_LENGTH(str) &#xff1a;返回字符串 str 中字符的数量&#xff08;对于多字节字符集如UTF-8更为精确&#xff0c;因为它会按照字符而非字节计数&#xff09;。 如果字符串中都是单字节字符&#xff0c;或者不在…

Python接口自动化之接口依赖

一、场景说明 在面试接口自动化时&#xff0c;经常会问&#xff0c;其他接口调用的前提条件是当前用户必须是登录状态&#xff0c;如何处理接口依赖&#xff1f; 在此之前我们介绍过session管理器保存会话状态。如果接口请求需要携带token&#xff0c;那么又如果处理呢&#…

绿色再生·安卓4G智能远程操作巡视机器人小车

一、前言 1.1 项目介绍 【1】项目功能介绍 随着物联网技术与移动通信技术的快速发展&#xff0c;远程遥控设备在日常生活及工业应用中的普及度日益提高。无论是家用扫地机器人实现自主导航清扫&#xff0c;还是目前抖音平台上展示的实景互动小车等创新应用&#xff0c;都体现…

【探索AI】三十二-计算机视觉(七)实践项目与案例分析

实践项目与案例分析 图像分类项目:使用公开数据集CIFAR-10和ImageNet进行训练和评估概念及步骤代码实例目标检测项目:实现基于YOLO或SSD的实时目标检测步骤 1: 环境准备步骤 2: 数据集准备步骤 3: 模型选择与下载步骤 4: 编写代码加载模型步骤 5: 实时视频流处理步骤 6: 处理…

Device Tree (四) - device_node -> platform_device

一&#xff0c;调用到of_platform_populate的流程 kernel V5.10: start_kernel(void) ----setup_arch(&command_line); --------setup_machine_fdt(__fdt_pointer); /* D:\work\source_code\msm-kernel\msm_kernel\arch\arm64\kernel\setup.c */ --------unflatten_device…

Jasypt 配置文件加密的用法

Jasypt 是一个用于配置文件加密的 Java 库。它可以用来加密和解密配置文件中的敏感信息&#xff0c;如数据库密码、API 密钥等。 使用 Jasypt 加密配置文件的步骤如下&#xff1a; 引入 Jasypt 依赖 首先&#xff0c;在你的项目的构建文件中添加 Jasypt 依赖。如果使用 Maven&…

AI系统性学习04—文本嵌入模型

文本嵌入&#xff08;text embedding&#xff09;是自然语言中的一项重要技术&#xff0c;是将文本转换了固定长度的低密度集向量的表示。 文章目录 1、文本嵌入介绍1.1 介绍1.2 文本嵌入与文本向量1.3 应用场景1.4 常用的文本嵌入模型 2、M3E文本嵌入模型2.1 模型介绍2.2 模型…

Games101笔记-模型、视图、投影

在旋转点&#xff0c;旋转矩阵的逆等于矩阵的转置 视图变换和投影变换 三维变换 左边3*3是线性变换&#xff0c;右边一列是仿射变换(平移) 先线性再平移 缩放、旋转、平移 x叉乘y得到z&#xff0c;y叉乘z得到x&#xff0c; xyz给任何两个可以得到另一个 (循环对称) z叉乘x得…

sqllab第十一关通关笔记

知识点&#xff1a; 发现登录框就可以尝试注入登录框一般都是字符型注入通过注入可以获取其他表的信息绕过手段 单引号闭合联合注入也可以进行错误注入 首先看界面是一个登录框&#xff1b;通过admin admin登录进去&#xff0c;发现页面会把用户名和密码的登录信息打印出来&am…

美区PayPal绑visa卡注意事项

很多小伙伴都有绑定paypal的需求&#xff0c;但是如果你是绑定美区的paypal这里有几点建议&#xff1a; 1、建议使用US的网络环境注册 2、使用美区的账号 3、使用美区的visa卡 三者统一才可以绑定成功&#xff0c;点击获取可以绑定美区paypal的visa卡&#xff0c;办理简单

【超细完整版】C# 获取WebService所有方法并调用 【调用篇】

注意&#xff1a;该文章涉及到的调用方法若找不到 请移步第一部分内容查找 C# 生成wsdl和dll教程请移步 【超细完整版】C# WebService 通过URL生成WSDL文件和DLL文件> 【生成篇】 开始 首先实现一个类&#xff0c;用于实现对URL的验证等 public class InputFormatVerifica…

【vue elementUI】修改el-dropdown样式

实现效果如下&#xff1a; 代码如下&#xff1a; <el-dropdown trigger"click" command"handleCommand" active-text-color"#606266"><span class"product-card">{{getCategoryName(categoryId)}}</span><el-dro…

docker安装华为opengauss高斯数据库

opengauss高斯数据库 openGauss是一款企业级开源关系型数据库&#xff0c;由华为公司推出。它深度融合了华为多年的数据库领域经验&#xff0c;充分结合企业级场景需求&#xff0c;基于openGauss自研生态而打造。 在架构上&#xff0c;openGauss着重于传统数据库的企业级能力和…

Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

背景介绍 书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》&#xff0c;在头条工程切换至 Bazel 构建系统后&#xff0c;为了支持用户使用 Xcode 开发的习惯&#xff0c;我们使用了开源项目 Tulsi 作为生成工具&#xff0c;用于将 Bazel 工程转换为 Xcode 工程。但是…

sqllab第二十七关通关笔记

知识点&#xff1a; union select 关键字过滤 通过<> /**/进行截断处理 un<>ion sel<>ect 没效果uni/**/on sel/**/ect 被过滤了双写绕过 这关对select进行了多重过滤&#xff0c;无法进行双写绕过 大小写绕过 UNion SElect (这关可以用&am…

亚马逊优惠券新规颁布,卖家应该如何应对?

最近亚马逊优惠券新规引发了很多跨境卖家的热议&#xff0c;内容显示&#xff0c;亚马逊于2024年3月12日实施新的优惠券规则&#xff0c;在这之后卖家提报优惠券需要遵守新的定价要求。到底发生了哪些变化和调整呢&#xff1f;今天就跟大家分析亚马逊优惠券新规政策的调整以及卖…