uniAPP 视频图片预览组件

news2024/9/8 23:50:31

效果图

 

思路:处理文件列表,根据文件类型归类


已兼容 H5  ios 设备,测试已通过 浙政钉,微信小程序
视频资源因为,没有预览图,用灰色图层加播放按钮代替

<template>
	<!--视频图片预览组件 -->
	<view v-if="list.length">
		<view class="back-medio">
			
			<view v-if="imgList.length" class="img-box" v-for="(item,index) in imgList" :key="index">
				<img :src="item.filepath" class="step-img" @click="viweImage(item.filepath)" />
				<view class="img-num" v-if="index == '0'">
					{{ list.length }}张
				</view>
			</view>
			<view v-if="videoList.length" v-for="(item,id) in videoList" :key="id+'d'" class="img-box"
				@click="playvideo(item)">
				<view class="step-img vide-back">
					<img :src="playIcon" class="playIcon" />
				</view>
			</view>
			</view>
		</view>
		<!-- 视频预览 兼容H5-->
		<uni-popup ref="videoShow" :mask-click="false">
<view class="viewVideo">
				<!-- 兼容H5 -->
				<view class="close" @click="fullscreenchange"></view>
				<video id="myVideo" :src="cVideo" object-fit='contain' autoplay="false" :controls="true"
show-fullscreen-btn="false" play-btn-position="center" show-loading='true'
					@fullscreenchange="fullscreenchange"></video>
			</view>
		</uni-popup>
	</view>
</template>
<script>

	export default {
		props: {
			list: {
				type: [Array,Object],
				default:[],
                // 示例数据
				// {
				//     "createTime": "2023-07-04 02:34:15",
				//     "modifyTime": "2023-07-04 02:34:15",
				//     "id": 4086,
				//     "filepath": "https://wsgz.deqing.gov.cn/images/4/20230704103415Dingtalk_20230526111858.jpg",
				//     "filename": "20230704103415Dingtalk_2023052
                // }
},
		},
		created() {
			this.init('1')
		},
		watch: {
			list() {
				this.init('1')
				console.log("ls",this.list)
			}
		},
data() {
			return {
				videoList: [], //媒体文件列表
				imgList: [], //媒体文件列表
				cVideo: '', //当前播放视频
				// 图标
				playIcon: 替换成播放图标bese64代码,
}
		},
		methods: {
			// 关闭视频弹窗
			close() {
				this.$refs.videoShow.close()
			},
// 点击视频封面预览视频
			playvideo(item) {
				console.log("播放", item)
				this.cVideo = item.filepath
				this.$refs.videoShow.open('top')
				this.videoContext = uni.createVideoContext('myVideo', this);
				// this.videoContext.requestFullScreen({
				// 	direction: 0
				// });
				this.videoContext.play()
			},
			// 视频0 满屏点击关闭
			fullscreenchange() {
				this.cVideo = ''
				this.videoContext.pause()
				this.close()
			},
            // 预览图片单张
			viweImage(e) {
				console.log(" 预览图片单张", e)
				uni.previewImage({
					current: 0,
					urls: [e]
				});
			},
            // 预览图片单张
			viweImage(e) {
				console.log(" 预览图片单张", e)
				uni.previewImage({
					current: 0,
					urls: [e]
				});
			},
init(bu) {
				console.log("dfsfsfss", bu, this.list,this.list.constructor)
				let th = this
				let arr =th.list
				th.videoList = []
				th.imgList = []
				arr.length && arr.forEach((item) => {
					// if (item.imgPath) {
					let type = item.fileExtName
					if (type == "mp4" || type == "rmvb" || type == "avi" || type == "ts") {
						th.videoList.push(item)
					} else {
						th.imgList.push(item)
					}
})
				// console.log("处理:", this.videoList, this.imgList)
			}
		}
}
</script>

<style lang="scss">
	.dynamic-img {
		margin-top: 20rpx;
		display: flex;
		flex-wrap: wrap;
		height: 120rpx;
		overflow: hidden;
image {
			height: 120rpx;
			width: 120rpx;
			margin-right: 16rpx;
		}

		.video-box {
			height: 120rpx;
			width: 120rpx;
			margin-right: 16rpx;
			position: relative;

			.triangle {
display: inline-block;
				font-size: 0;
				overflow: hidden;
				z-index: 2;
				top: 50rpx;
				right: 50rpx;
			}

			.triangle:before {
				content: "";
				position: relative;
				display: inline-block;
				border: 25rpx solid transparent;
			}
.triangle-right {
				position: absolute;
				right: 35rpx;
				top: 36rpx;
				border-top-right-radius: 50%;
				border-bottom-right-radius: 50%;
			}

			.triangle-right:before {
				left: 2px;
				border-right-width: 0;
				border-left-width: 50rpx;
				border-left-color: rgb(181, 181, 181);
			}

			.black {
				z-index: 1;
				position: absolute;
				top: 0;
				left: 0;
				height: 120rpx;
				width: 120rpx;
				background: #000000;
				opacity: 0.4;
			}
.video {
				position: absolute;
				top: 0;
			}
		}
	}

	.viewVideo {
        width: 100vw;
		min-height: 100vh;
		display: -webkit-box;
		display: -webkit-flex;
		display: flex;
		align-items: flex-start;
		justify-content: center;
		background: #000000;
		flex-wrap: wrap;
.close {
			width: 80rpx;
			height: 80rpx;
			z-index: 99999;
			position: relative;
			margin: 0 auto;
			top: 60rpx;
		}

		.close:before,
.close:after {
			position: absolute;
			left: 40rpx;
			content: ' ';
			height: 80rpx;
			width: 8rpx;
			background-color: #EFEFF4;
		}

		.close:before {
			transform: rotate(45deg);
		}

		.close:after {
			transform: rotate(-45deg);
		}
	}
#myVideo {
		width: 100vw;
		height: 80vh;
		margin: 20px 0;
	}
	.back-medio {
		display: flex;
		flex-wrap: wrap;
		height: 48.4px;
		overflow: hidden;

		.vide-back {
			background: #3a3939c4;
		}
.img-box {
			position: relative;
			width: 62.23px;
			height: 48.4px;
			margin-right: 8px;
			margin-bottom: 8px;
			overflow: hidden;
			.step-img {
				width: 62.23px;
				height: 48.4px;
				border-radius: 4px;
			}
.playIcon {
				width: 30px;
				height: 30px;
				margin: 9px 16px;
			}

			.img-num {
				position: absolute;
				top: 0;
				right: 0;
				height: 32rpx;
				line-height: 32rpx;
                padding: 0 10rpx;
				font-size: 20rpx;
				z-index: 8;
				color: #ffffff;
				background: rgba(0, 20, 54, 0.6);
				border-radius: 0px 20rpx;
			}
		}
	}
.video-box {
		width: 62.23px;
		height: 48.4px;

		.video::-webkit-media-controls {

			display: none !important
		}

	}
</style>

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

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

相关文章

【2023最新教程】6个步骤从0到1开发自动化测试框架(0基础也能看懂)

一、序言 随着项目版本的快速迭代、APP测试有以下几个特点&#xff1a; 首先&#xff0c;功能点多且细&#xff0c;测试工作量大&#xff0c;容易遗漏&#xff1b;其次&#xff0c;代码模块常改动&#xff0c;回归测试很频繁&#xff0c;测试重复低效&#xff1b;最后&#x…

使用MyBatis(1)

目录 一、什么是MyBatis 二、搭建MyBatis开发环境 &#x1f345;添加MyBatis依赖 &#x1f345;在数据库添加数据 &#x1f345;设置MyBatis配置 &#x1f388;数据库的相关连接信息&#x1f388;xml的保存和设置路径 三、使用MyBatis模式和语法操作数据库 &#x1f34…

BGP的介绍

目录 BGP基础 BGP的发展历史 BGP在企业中的应用 距离矢量型协议和路径矢量型协议的区别 BGP的特征 1.可控性 2.可靠性 3.AS-BY-AS BGP的对等关系 BGP的数据包 1.open报文 2.Keepalive报文 3.Update报文 4.Notification 报文 5.Route-refresh报文 BGP的状态机 …

GitLab备份升级

数据备份(默认的备份目录在/var/opt/gitlab/backups/下&#xff0c;生成一个以时间节点命名的tar包。) gitlab-rake gitlab:backup:create新建repo源&#xff0c;升级新版本的gitlab vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] namegitlab-ce baseurlhttps://mirrors.…

EMQ X 集群部署

EMQ X 消息服务器集群基于 Erlang/OTP 分布式设计,集群原理可简述为下述两条规则: MQTT 客户端订阅主题时,所在节点订阅成功后广播通知其他节点:某个主题(Topic)被本节点订阅。 MQTT 客户端发布消息时,所在节点会根据消息主题(Topic),检索订阅并路由消息到相关节点。 1. 集…

ICLR 2023 | 用于分布外泛化的拓扑感知鲁棒优化

论文链接&#xff1a;https://openreview.net/pdf?idylMq8MBnAp 代码链接&#xff1a;GitHub - joffery/TRO: The Pytorch implementation for "Topology-aware Robust Optimization for Out-of-Distribution Generalization" (ICLR 2023) 01. 研究背景 近年来&…

虹科分享 | 工业4.0:IO-Link wireless等先进通信技术是不可或缺的支柱

近年来&#xff0c;随着工业4.0&#xff08;工业革命4.0&#xff09;的提出&#xff0c;制造业转型浪潮拉开帷幕。工业4.0是将数字技术整合到传统的制造流程中&#xff0c;从而创建智能工厂。对此类工厂的最初要求是工厂各个层面的完全连接&#xff0c;从制造车间一直到管理和云…

重大更新|Sui主网即将上线流动性质押,助力资产再流通

Sui社区一直提议官方上线流动质押功能&#xff0c;现在通过SIP过程&#xff0c;已经升级该协议以实现这一功能。 Sui使用委托权益证明机制&#xff08;DPoS&#xff09;来选择和奖励负责运营网络的验证节点。为了保障网络安全&#xff0c;验证节点通过质押SUI token获得质押奖…

win10小任务栏显示日期

win10存在一个问题, 就是任务栏为小任务栏时, 无法显示系统日期, 只能显示时间, 对这个问题有两个办法, 1, 把小任务栏改为大任务栏, 日期就能显示出来 但如果你就是想用小任务栏, 不想用大任务栏, 又想显示日期, 只靠win10内置的设置是没法实现的, 只能借助其他软件, 具体看…

HTTP协议揭秘:探寻互联网的背后密码、探秘数据传输的奥秘

HTTP&#xff08;超文本传输协议&#xff1a;Hypertext Transfer Protocol&#xff09;是一种用于在Web上传输数据的协议&#xff0c;它是互联网上最重要的应用层协议之一。从诞生至今&#xff0c;HTTP一直扮演着连接世界的通信桥梁的角色&#xff0c;在互联网的发展和普及中发…

数组练习题,数组的动态初始化

数组的遍历 定义一个数组&#xff0c;求和 int[] arr {1,2,3,4,5,6,7};int sum 0;for (int i 0; i <arr.length ; i) {sum sum arr[i];}System.out.println(sum);定义一个数组&#xff0c;统计数组里面一共有多少能够被3 整除的数字&#xff1a; int[] arr1 {4,62,8…

JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器

JavaScript快速入门&#xff1a;ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器 在当今丰富的网络环境中&#xff0c;处理 PDF 文档已成为企业和开发人员的必需品。ComPDFKit 是一款支持 Web 平台并且功能强大的 PDF SDK&#xff0c;开发人员可以利用它创建 PDF 查看器和编辑器&…

了解Unity编辑器之组件篇Playables和Rendering(十)

Playables 一、Playable Director&#xff1a;是一种用于控制和管理剧情、动画和音频的工具。它作为一个中央控制器&#xff0c;可以管理播放动画剧情、视频剧情和音频剧情&#xff0c;以及它们之间的时间、顺序和交互。 Playable Director组件具有以下作用&#xff1a; 剧情控…

数据结构初阶--栈和队列

目录 一.栈 1.栈的定义 2.顺序栈的功能实现 2.1.顺序栈的定义 2.2.顺序栈的初始化 2.3.顺序栈的判空 2.4.顺序栈的入栈 2.5.顺序栈的出栈 2.6.顺序栈的取栈顶元素 2.7.顺序栈的求栈的大小 2.8.顺序栈的销毁 2.9.完整程序 Stack.h Stack.c test.c 二.队列 1.队…

S475支持 ModbusRTU 转 MQTT协议采集网关

6路模拟量输入和2路RS485串口是一种功能强大的通信接口&#xff0c;可以接入多种设备和系统&#xff0c;支持4-20mA输出的传感器以及开关量输入输出。本文将详细介绍6路模拟量输入和2路RS485串口的应用场景和功能&#xff0c;重点介绍其在SCADA、HMI、远程数据监控以及采集控制…

机器学习——样本不均衡学习

1、样本不均衡定义 一般在分类机器学习中&#xff0c;每种类别的样本是均衡的&#xff0c;也就是不同目标值的样本总量是接近的&#xff0c;但是在很多场景下的样本没有办法做到理想情况&#xff0c;甚至部分情况本身就是不均衡情况&#xff1a; &#xff08;1&#xff09;很多…

[洛谷]P2052 [NOI2011] 道路修建(dfs)

在递归过程中也把子节点的贡献&#xff08;以及左右国家数记录下来了&#xff09;。 void dfs(int u,int fa) {d[u]1;//当前节点也算一个 for(int ih[u]; i; ine[i]) {int toe[i];//子节点if(tofa) continue;//防止重复搜索&#xff0c;即防止从下往上搜dfs(to,u);//子节点 //…

基于SSM+JSP+LayUI的宿舍管理系统

修正初始账号密码 默认账号&#xff1a;admin&#xff0c;默认密码&#xff1a;123456修复后台管理头像消失功能相对简单些&#xff0c;可能需要添加一些功能&#xff0c;需要源码免费提供需要运行服务、添加功能等联系我

springboot开放实验室管理系统【纯干货分享,免费领源码03361】

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是使用动态网页开发技术java作为系统的开发语言&#xff0c;M…

如何挑选滚珠螺杆的润滑油脂?

滚珠螺杆在日常使用中&#xff0c;出现卡顿或者噪音等问题&#xff0c;不用担心&#xff0c;不是你的滚珠螺杆出了问题&#xff0c;而是润滑系统出了问题&#xff0c;提醒你应该更换润滑油了。那么&#xff0c;我们应该怎样挑选滚珠螺杆的润滑油呢&#xff1f; 一般建议用轴承润…