WebGis014-动画效果控件

WebGis014-动画效果控件

在ol5中,动画效果由ol.View.animate()方法提供。在调用这个方法时,可以通过传递一个或者多个对象参数来实现多种动画效果。可实现;旋转、弹性移动、反弹,结合相关API可做出带有动画的定位效果。

  1. 在mapControls文件夹下创建mapAnimation.html文件

  2. 创建map对象添加控制按钮组,给按钮分别绑定事件,在事件中调用view对象的animate方法设置动画各个阶段效果,实现的时候其实有个平滑移动的效果就可以了。

  3. 代码如下

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<link rel="stylesheet" type="text/css" href="../../css/ol.css" />
    		<script src="../../js/ol.js" type="text/javascript" charset="utf-8"></script>
    
    		<style type="text/css">
    			* {
    				box-sizing: border-box;
    			}
    
    			body {
    				margin: 0px;
    				padding: 0px;
    				height: 100vh;
    			}
    
    			#map {
    				height: 100%;
    			}
    		</style>
    	</head>
    	<body>
    		<div class="btn_group">
    			<button id="ly">雒陽</button>
    			<button id="ny">南陽</button>
    			<button id="xy">襄陽</button>
    			<button id="xa">西安</button>
    			<button id="nj">南京</button>
    		</div>
    		<div id="map">
    		</div>
    
    		<script type="text/javascript">
    			console.log(ol.easing);
    
    			var view = new ol.View({
    				center: ol.proj.fromLonLat([112.388, 34.655]),
    				zoom: 10
    			})
    
    			// 创建天地图影像图层
    			var img_w = new ol.layer.Tile({
    				name: "天地图卫星影像",
    				source: new ol.source.XYZ({
    					url: "http://t0.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=9b0042eb1f01265c357f96da559ae11c"
    				})
    			})
    
    			var cia_w = new ol.layer.Tile({
    				name: "天地图影像注记",
    				source: new ol.source.XYZ({
    					url: "http://t0.tianditu.com/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=9b0042eb1f01265c357f96da559ae11c"
    				})
    			});
    
    			// 创建地图对象
    			var map = new ol.Map({
    				target: "map",
    				layers: [],
    				view: view
    			});
    
    			// 把图层和地图绑定
    			map.addLayer(img_w)
    			map.addLayer(cia_w)
    
    
    			// 定位个城市位置
    			var ly = ol.proj.fromLonLat([112.388, 34.655])
    			var ny = ol.proj.fromLonLat([112.511, 32.955])
    			var xy = ol.proj.fromLonLat([112.2118, 31.955])
    			var xa = ol.proj.fromLonLat([108.955, 34.155])
    			var nj = ol.proj.fromLonLat([119.188, 32.000])
    
    
    			/* 		// 获取反弹值
    					function bounce(t){
    						var s = 7.5652,p=2.75,l;
    						if(t<(1/p)){
    							l = s*t*t;
    						}else if(t<(2/p)) {
    							t-=(1.5/p)
    							l=s*t*t+0.75;
    						}else if(t<2.5/p){
    							t-=(2.25/p);
    							l=s*t*t+0.9375;
    						}else {
    							t-=(0.625/p);
    							l=s*t*t+0.984375
    						}
    						
    						return l;
    					}
    				
    				
    					// 获取弹性伸缩值
    					function elastic(t){
    						return Math.pow(2,-10*t)*Math.sin((t-0.072)*(2*Math,PI)/3)+1;
    					} */
    
    
    
    			// 旋转定位
    			document.querySelector("#ny").onclick = () => {
    				var center = view.getCenter();
    				view.animate(
    					// 第一个过程
    					{
    						center: [
    							center[0] + (ny[0] - center[0]) / 2,
    							center[1] + (ny[1] - center[1]) / 2
    						],
    						rotation: Math.PI * 1,
    						duration: 100,
    						easing: ol.easing.easeIn
    					},
    					// 第二个过程
    					{
    						center: ny,
    						rotation: Math.PI * 2,
    						duration: 100,
    						easing: ol.easing.easeOut
    					}
    				)
    			}
    
    
    			// 先快后慢
    			document.querySelector("#xy").onclick = () => {
    				var center = view.getCenter();
    				view.animate(
    					// 只有一个过程
    					{
    						center: xy,
    						duration: 200,
    						easing: ol.easing.easeOut
    					}
    				)
    			}
    
    			// 线性动画
    			document.querySelector("#xa").onclick = () => {
    				var center = view.getCenter();
    				view.animate(
    					// 只有一个过程
    					{
    						center: xa,
    						duration: 200,
    						easing: ol.easing.linear
    					}
    				)
    			}
    
    			// 慢入慢出中间快
    			document.querySelector("#nj").onclick = () => {
    				var center = view.getCenter();
    				view.animate(
    					// 只有一个过程
    					{
    						center: nj,
    						duration: 200,
    						easing: ol.easing.inAndOut
    					}
    				)
    			}
    
    			// 慢入慢出中间快
    			document.querySelector("#ly").onclick = () => {
    				var center = view.getCenter();
    				view.animate(
    					// 只有一个过程
    					{
    						center: ly,
    						duration: 200,
    						easing: ol.easing.inAndOut
    					}
    				)
    			}
    		</script>
    	</body>
    </html>
    
    

    效果图如下
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值