1
0
mirror of https://github.com/Daotin/Web.git synced 2024-11-01 13:34:47 +08:00
Web-main/16-前端综合/02-Hybrid混合开发.md
2020-12-30 11:39:04 +08:00

7.5 KiB
Raw Blame History

一、混合开发Hybrid

移动端UI一般分为

原生appnative App

网页appweb app

Hybrid App是指介于web-app、native-app这两者之间的app,它虽然看上去是一个Native App但只有一个UI WebView里面访问的是一个Web App。

hybrid开发app一般遵循

对于不经常改变视图的使用native APP开发经常改变的使用 web APP就综合了native APP和web App的优点。

1、安装环境

这里使用HbuilderX集成的H5+开发hybrid app。

下载安装HbuilderX之后在运行里面安装手机运行的插件

然后我们开发的H5+程序才可以在手机运行。

环境搭建好后新建H5+APP项目在index.html中编写代码即可。

H5+的API文档参考https://www.html5plus.org/doc/zh_cn/accelerometer.html

新建的项目中有个

document.addEventListener('plusready', function() {}

这个是hbuilder为hybrid开发准备的只有在hybrid开发中才会有这个事件。所有对移动端事件的api调用均在该事件触发后通过plus.的形式进行调用。

这有点类似hbuilder为hybrid开发而开发的一套框架便于我们调用设备底层信息。

2、示例水平仪

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
		<title></title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}
			
			button {
				width: 150px;
				height: 50px;
			}
			
			.acc {
				width: 300px;
				height: 300px;
				border-radius: 50%;
				background-color: green;
				position: fixed;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
			}
			
			.acc:before {
				content: '';
				display: block;
				width: 50px;
				height: 50px;
				background-color: rgba(0,0,0,0.35);
				border-radius: 50%;
				position: absolute;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
			}
			
			.point {
				width: 50px;
				height: 50px;
				background-color: rgba(255,255,255,0.7);
				border-radius: 50%;
				position: absolute;
				top: 50%;
				left: 50%;
				margin-left: -25px;
				margin-top:-25px;
				transition: all 100ms;
			}
		</style>
	</head>
	<body>
		<button id="startAcc">开始水平仪</button>
		<button id="stopAcc">停止水平仪</button>
		
		<div class="acc">
			<div class="point" id="point"></div>
		</div>
	</body>
	<script type="text/javascript">
		let startAcc = document.getElementById('startAcc');
		let stopAcc = document.getElementById('stopAcc');
		let point = document.getElementById('point');
		
		var wid = 0;

		document.addEventListener('plusready', function() {
			//console.log("所有plus api都应该在此事件发生后调用否则会出现plus is undefined。"

			startAcc.onclick = function() { 
				// 获取手机重力传感器的值
// 				plus.accelerometer.getCurrentAcceleration(info => {
// 					console.log(`x轴重力传感器的值: ${info.xAxis}`);
// 					console.log(`y轴重力传感器的值: ${info.yAxis}`);
// 					console.log(`z轴重力传感器的值: ${info.zAxis}`);
// 				}, e => {
// 					alert( "Acceleration error: " + e.message ); 
// 				});
				
				
				
				// 监听重力加速度
// 				wid = plus.accelerometer.watchAcceleration(info => {
// 					console.log(`x轴重力传感器的值: ${info.xAxis}`);
// 					console.log(`y轴重力传感器的值: ${info.yAxis}`);
// 					console.log(`z轴重力传感器的值: ${info.zAxis}`);
// 				}, e => {
// 					alert( "Acceleration error: " + e.message ); 
// 				},{frequency:1000});


				// 监听水平仪
				wid = plus.accelerometer.watchAcceleration(info => {
// 					console.log(`x轴重力传感器的值: ${info.xAxis}`);
// 					console.log(`y轴重力传感器的值: ${info.yAxis}`);
// 					console.log(`z轴重力传感器的值: ${info.zAxis}`);
					let x = 12.7551 * info.xAxis; // 小球x方向移动的最大范围 150-25 / 9.8 = x / info.xAxis
					let y = -12.7551 * info.yAxis;
					point.style.transform = `translate(${x}px, ${y}px)`;
					
					if(Math.abs(x) < 2 && Math.abs(y) < 2) {
						point.style.background = 'rgba(255,0,0,0.7)';
					} else {
						point.style.background = 'rgba(255,255,255,0.7)';
					}
				}, e => {
					alert( "Acceleration error: " + e.message ); 
				},{frequency:100});				
			}
			
			stopAcc.onclick = function() {
				plus.accelerometer.clearWatch( wid );
			}

		});
	</script>
</html>

3、示例照相机

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
		<title></title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}
			
			button {
				width: 150px;
				height: 50px;
			}
			
			img {
				width: 100%;
				height: auto;
				display: block;
			}
			
			
		</style>
	</head>
	<body>
		<button id="start">开始拍照</button>
		<!-- <button id="stop">停止水平仪</button> -->
		
		<img src="" id="img">

	</body>
	<script type="text/javascript">
		let start = document.getElementById('start');
		let stop = document.getElementById('stop');
		
		let img = document.getElementById('img');

		document.addEventListener('plusready', function() {
			start.addEventListener('click', function() {
				let cam = plus.camera.getCamera(); // 获取主摄像头
				
				cam.captureImage(path=>{
					// path是手机本地相对路径
					// convertLocalFileSystemURL: 将本地URL路径转换成平台绝对路径
					img.src = plus.io.convertLocalFileSystemURL(path);
				}, err=>{
					console.log('拍照失败!');
				});
			})
			
		});
	</script>
</html>

4、示例地图

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
		<title></title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}

			button {
				width: 150px;
				height: 50px;
			}

			#area {
				width: 100%;
				height: 400px;
			}
		</style>
	</head>
	<body>
		<button id="start">显示地图</button>
		<!-- <button id="stop">停止水平仪</button> -->

		<div id="area"></div>

	</body>
	<script type="text/javascript">
		let start = document.getElementById('start');

		let area = document.getElementById('area');

		document.addEventListener('plusready', function() {
			start.addEventListener('click', function() {
				// 获取当前位置经纬度
				// longitude:经度 latitude:纬度
				plus.geolocation.getCurrentPosition(position => {
					// 创建Point对象
					var ptObj = new plus.maps.Point(position.coords.longitude, position.coords.latitude);
					
					// 创建地图空间对象
					var mapObj = new plus.maps.Map('area', {
						// 地图中心位置
						center: ptObj,
						// 地图缩放级别
						zoom: 16,
						// 显示缩放控件
						zoomControls: true,
						// 地图的视图类型 
						// MAPTYPE_NORMAL:普通街道地图
						// MAPTYPE_SATELLITE: 卫星视图
						type: plus.maps.MapType.MAPTYPE_NORMAL,
						// 地图的是否显示交通信息
						traffic: true,
					});
					
					// 创建气泡标点
					var marker = new plus.maps.Marker( ptObj );
					marker.setLabel("我的位置");
					var bubble = new plus.maps.Bubble("点击标点显示的内容");
					marker.setBubble(bubble);
					// 将标点加到地图上
					mapObj.addOverlay(marker);
				});
			})

		});
	</script>
</html>