前端对krpano全景图添加热点有两种方式,一种是修改xml文件添加hotsport,第二种是通过js操作
前情提要,html部分不再赘述

vue中krpano添加热点

在xml中添加热点

在tour.xml文件中找到<scene>,在其中添加<hotspot/>

// tour.xml
<scene ...> // 一般scene标签体内有很多配置项,此处不赘诉
	// 也可以换成自己喜欢的图标
	<hotspot name="按需" url="skin/vtourskin_hotspot.png"/>
</scene>
在vue中添加热点
// 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) );");
	}
}
krpano-interface对象提供了以下js函数
函数
set(variable, value)将任何 krpano 变量设置为给定值
get(variable)返回 krpano 变量的值
call(action)调用并执行 krpano 操作代码
spheretoscreen(h, v)直接调用 spheretoscreen 操作,返回值将是具有 x, y 属性的对象
screentosphere(x, y)直接调用 screentosphere 操作,返回值将是具有 x, y 属性的对象
hotspot常用参数
参数
name定义热点名称
type定义热点类型,image,text(textfield.)
url热点图像路径,支持SWF, JPG, PNG, GIF
onout鼠标停移出范围时时执行动作
onclick鼠标停点击时执行动作
ondown鼠标按下时执行动作
onup鼠标按键松开时执行动作
onloaded加载元素完成后执行动作
创建/添加热点、删除热点

addhotspot(name, varname*) removehotspot(name)

Logo

前往低代码交流专区

更多推荐