uniapp展示本地swf格式文件,实现交互

概览

uniapp打包的Android项目实现本地swf格式文件的展示,并且能够进行交互

需求分析

1、因为是打包的Android项目展示本地的swf文件,首先需要拿到这个本地的swf文件路径

2、如何在uniapp的vue页面中展示swf,因为没有直接展示swf文件的标签/组件,考虑使用web-view组件来进行展示swf文件

3、直接使用web-view组件无法展示swf,使用html先展示swf,然后把html链接放到web-view中进行展示

4、html中如何展示swf,把swf转为html来进行展示这个swf文件(使用开源的js实现,下载地址:https://download.csdn.net/download/ahualong1/89900202

具体实现

1、flashPage.vue页面

javascript 复制代码
<template>
	<view :style="{height: screenHeight + 'px'}">
		<!-- <titleViewVue :titleName="titleName" class="VideoTitleViewClass"></titleViewVue> -->
		<web-view :src="url" @message="handlePostMessage"></web-view>
	</view>
</template>

<script>
	import titleViewVue from '../../components/titleView/titleView.vue'
	import {uploadStudyTime} from '@/api/api.js'
	export default {
		components: {
			titleViewVue
		},
		data() {
			return {
				titleName: '',//标题
				SubjectId: '',
				videoSrc: '',//视频资源本地地址
				videoHeight: '',
				videoWidth: '100%',
				screenHeight: '',
				
				startTime: 0,
				fileUrl: '',
				url: ''
			}
		},
		onLoad(option) {
			this.startTime = Date.now()
			this.screenHeight = getApp().globalData.screenHeight;
			// 定义视频URL
			this.titleName = option.titleName?option.titleName:''
			this.SubjectId = option.SubjectId + ''
			this.fileUrl = option.url
			this.url = '/static/flash.html?filePath=' + plus.io.convertLocalFileSystemURL(this.fileUrl) + '&titleName=' + this.titleName
		},
		onUnload() {
			if(!getApp().globalData.isGuest){
				this.uploadSduyTimePage()
			} 
		},
		methods: {
			uploadSduyTimePage(){
				var upLoadTime = {
					"subject_id": this.SubjectId,
					"date": this.$utils.formatDateTime(),
					"time": Date.now() / 1000 - this.startTime / 1000
				}
				this.startTime = 0
				const arryUpload = []
				arryUpload[0] = upLoadTime
				uploadStudyTime({"data": arryUpload}).then(res=>{
					if(res.data.code == 200 && res.data.status == 'success'){
						
					}else{
						if(uni.getStorageSync('uploadTime')){
							arryUpload = []
							arryUpload = uni.getStorageSync('uploadTime')
							arryUpload.push(upLoadTime)
							uni.setStorageSync('uploadTime',arryUpload)
						}else{
							arryUpload = []
							arryUpload.push(upLoadTime)
							uni.setStorageSync('uploadTime',arryUpload)
						}
					}
				})
			},
			handlePostMessage(){
				uni.navigateBack()
			}
		}
	}
</script>

<style>

</style>

码中fileUrl 为uni.saveFile()保存到本地的路径,直接打开是无法展示的,需要使用plus的api:plus.io.convertLocalFileSystemURL(this.fileUrl) 将本地文件系统的URL转换为跨域可以访问的URL

2、flash.html的具体代码

javascript 复制代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
	<head>
		<title>SWFObject 2 dynamic publishing example page</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<script type="text/javascript" src="swf2js.js"></script>

	</head>
	<body>
		<div style="width: 100%;height: auto;display: flex;align-items: center;justify-content: space-between;flex-direction: row;padding: 8px;background-color: #87B5F9;">
			<img src="leftarrow.png" style="height: 20px;" id="backClickId" />
			<div style="flex: 1;display: flex;align-items: center;justify-content: center;">
				<div id="titleNameId" style="color: #FFFFFF;font-size: 20px;"></div>
			</div>
		</div>
	</body>
	<!-- 微信 JS-SDK 如果不需要兼容小程序,则无需引用此 JS 文件。 -->
	<!-- <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> -->
	<!-- uni 的 SDK,必须引用。 -->
	<script type="text/javascript" src="../hybrid/html/web/uni.webview.js">

	</script>
	<script type="text/javascript">
		document.getElementById('backClickId').addEventListener('click', function() {
			uni.postMessage({
				data: {
					"back": true
				}
			});
		});
		window.onload = function() {
			if(location.href.includes('filePath')){
				swf2js.load(getParameterByName('filePath', ''))
			}
			if (location.href.includes('titleName')) {
				document.getElementById('titleNameId').textContent = getParameterByName('titleName', '');
			} else {
				document.getElementById('titleNameId').textContent = '模拟训练';
			}
		};

		function getParameterByName(name, url) {
			if (!url) url = location.href;
			name = name.replace(/[\[\]]/g, '\\$&');
			var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
				results = regex.exec(url);
			if (!results) return null;
			if (!results[2]) return '';
			return decodeURIComponent(results[2].replace(/\+/g, ' '));
		}
	</script>
</html>

其中uni.postMessage 是web-view向uniapp.vue传递消息

javascript 复制代码
document.getElementById('backClickId').addEventListener('click', function() {
			uni.postMessage({
				data: {
					"back": true
				}
			});
		});

swf2js.load(getParameterByName('filePath', ''))为加载本地swf格式的资源代码

需要引入<script type="text/javascript" src="swf2js.js"></script>

方法getParameterByName 是获取打开的链接获取参数的方法

运行项目到模拟器或真机进行展示swf,就OK了。

可以查看项目中 pages-> flashPage->flashPage.vue页面

项目地址:https://download.csdn.net/download/ahualong1/89900184

参考开源项目:GitCode - 全球开发者的开源社区,开源代码托管平台

相关推荐
小嘟嚷ovo7 分钟前
h5,原生html,echarts关系网实现
前端·html·echarts
十一吖i37 分钟前
Vue3项目使用ElDrawer后select方法不生效
前端
只可远观37 分钟前
Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件
前端·flutter
周胡杰39 分钟前
组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
前端·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
敲代码的小吉米1 小时前
前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)
前端·javascript·pdf·状态模式
是千千千熠啊1 小时前
vue使用Fabric和pdfjs完成合同签章及批注
前端·vue.js
九月TTS1 小时前
TTS-Web-Vue系列:组件逻辑分离与模块化重构
前端·vue.js·重构
Blossom.1182 小时前
Web3.0:互联网的去中心化未来
人工智能·驱动开发·深度学习·web3·去中心化·区块链·交互
我是大头鸟2 小时前
SpringMVC 内容协商处理
前端
Humbunklung2 小时前
Visual Studio 2022 中添加“高级保存选项”及解决编码问题
前端·c++·webview·visual studio