赞
踩
前端对krpano全景图添加热点有两种方式,一种是修改xml文件添加hotsport,第二种是通过js操作
前情提要,html部分不再赘述
vue中krpano添加热点
在tour.xml文件中找到<scene>
,在其中添加<hotspot/>
// tour.xml
<scene ...> // 一般scene标签体内有很多配置项,此处不赘诉
// 也可以换成自己喜欢的图标
<hotspot name="按需" url="skin/vtourskin_hotspot.png"/>
</scene>
// vue2 <script> export default { data() { return { krpano: null } }, mounted() { embedpano({ swf:"/static/vtour/tour.swf", xml:"/static/vtour/tour.xml", target:"pano", html5:"auto", mobilescale:1.0, passQueryParameters:true, onready: this.krpanoOnready, }) }, methods: { krpanoOnready(krpano_interface) { this.krpano = krpano_interface }, addHotsport() { if (this.krpano) { let h = this.krpano.get('view.hlookat') // 水平视角 let v = this.krpano.get('view.vlookat') // 垂直视角 let hs_name = "hs" + ((Date.now() + Math.random()) | 0) // 多次点击增加热点,每个热点的名字 // call(action)调用并执行krpano操作代码,此处为addhotsport this.krpano.call("addhotspot(" + hs_name + ")"); // set(variable, value),将krpano变量设置为给定值,为hotsport设置url this.krpano.set("hotspot["+hs_name+"].url", "/static/vtour/skin/vtourskin_hotspot.png"); // 设置坐标 this.krpano.set("hotspot["+hs_name+"].ath", h); this.krpano.set("hotspot["+hs_name+"].atv", v); // 设置热点是否跟随场景进行3D扭曲 this.krpano.set("hotspot["+hs_name+"].distorted", true); // 热点点击事件 if ( this.krpano.get("device.html5") ) { // 对于HTML5,可以将JS函数直接分配给krpano事件 this.krpano.set("hotspot["+hs_name+"].onclick", function(hs) { alert('hotspot "' + hs + '" clicked'); }.bind(null, hs_name)); } else { // 对于Flash,需要使用js()操作从Flash调用js(此代码适用于Flash和HTML5) this.krpano.set("hotspot["+hs_name+"].onclick", "js( alert(calc('hotspot \"' + name + '\" clicked')) );"); } } } } } </script>
// vue3 <script setup> import { ref, onMounted } from 'vue' let krpano = ref(null) const krpanoOnready = krpano_interface => { krpano.value = krpano_interface } const addHotspot = () => { if (krpano) { let h = krpano.value.get('view.hlookat') let v = krpano.value.get('view.vlookat') let hs_name = "hs" + ((Date.now() + Math.random()) | 0) krpano.value.call("addhotspot(" + hs_name + ")"); krpano.value.set("hotspot["+hs_name+"].url", "/static/vtour/skin/vtourskin_hotspot.png"); krpano.value.set("hotspot["+hs_name+"].ath", h); krpano.value.set("hotspot["+hs_name+"].atv", v); krpano.value.set("hotspot["+hs_name+"].distorted", true); if ( krpano.value.get("device.html5") ) { krpano.value.set("hotspot["+hs_name+"].onclick", function(hs) { alert('hotspot "' + hs + '" clicked'); }.bind(null, hs_name)); } else { krpano.value.set("hotspot["+hs_name+"].onclick", "js( alert(calc('hotspot \"' + name + '\" clicked')) );"); } } } onMounted(() => { embedpano({ swf:"/static/vtour/tour.swf", xml:"/static/vtour/tour.xml", target:"pano", html5:"auto", mobilescale:1.0, passQueryParameters:true, onready: krpanoOnready, }) }) </script>
可以通过xml文件中
删除或注释<hotspot/>
来移除热点,也可以通过操作js来移除热点
// embedpano()与krpano上方有,不再浪费篇幅 // vue2 methods: { removeHotspot() { if (this.krpano) { this.krpano.call("loop(hotspot.count GT 0, removehotspot(0) );"); } } } /** call(action)调用并执行krpano操作代码 */ /** loop(条件,操作) 条件为真会重复调用/执行 */ /** hotsport.count 热点个数; GT 表达式,大于*/ // vue3 const removeHotspot = () => { if (krpano) { krpano.value.call("loop(hotspot.count GT 0, removehotspot(0) );"); } }
函数 | |
---|---|
set(variable, value) | 将任何 krpano 变量设置为给定值 |
get(variable) | 返回 krpano 变量的值 |
call(action) | 调用并执行 krpano 操作代码 |
spheretoscreen(h, v) | 直接调用 spheretoscreen 操作,返回值将是具有 x, y 属性的对象 |
screentosphere(x, y) | 直接调用 screentosphere 操作,返回值将是具有 x, y 属性的对象 |
参数 | |
---|---|
name | 定义热点名称 |
type | 定义热点类型,image,text(textfield.) |
url | 热点图像路径,支持SWF, JPG, PNG, GIF |
onout | 鼠标停移出范围时时执行动作 |
onclick | 鼠标停点击时执行动作 |
ondown | 鼠标按下时执行动作 |
onup | 鼠标按键松开时执行动作 |
onloaded | 加载元素完成后执行动作 |
addhotspot(name, varname*)
removehotspot(name)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。