# 点击穿透
点击穿透功能是与碰撞检测的形状检测开关接近的概念。
这两个功能,都是针对位图的完全透明像素区域来说的。打开点击穿透开关的位图,触摸其透明区域将不会再派发事件。
请注意本示例与碰撞检测示例的示例表现虽然很接近,但实现方式完全不同:点击穿透需要通过触摸事件来检测,而碰撞检测不需要任何触摸,是直接用一个点对一个显示对象进行检测。
var Main = VueEgret.classMain({
data: function () {
return {
dotX: 0,
dotY: 0,
showDot: false,
isTouch: false,
pixelHitTest: false,
texture: null,
};
},
mounted: function () {
var imgLoader = new egret.ImageLoader();
imgLoader.once(egret.Event.COMPLETE, function (evt) {
/// 将图像显示出来
var bmd = evt.currentTarget.data;
var texture = new egret.Texture();
texture.bitmapData = bmd;
this.texture = texture;
}, this);
imgLoader.load('../resource/cartoon-egret_01.png');
},
methods: {
onTouchBegin(evt) {
if (!this.$hitTestPoint('label', evt.stageX, evt.stageY)) {
/// if代码确保触摸开始位置不在文字区域
this.showDot = true;
this.isTouch = true;
this.onTouchMove(evt);
this.$nextTick(function () {
var shape = this.$refs['shape'];
shape.graphics.beginFill(0x00ff00);
shape.graphics.drawCircle(0, 0, 5);
shape.graphics.endFill();
});
}
},
onTouchMove(evt) {
if (this.isTouch) {
this.dotX = evt.stageX;
this.dotY = evt.stageY;
}
},
onTouchEnd() {
this.showDot = false;
this.isTouch = false;
},
},
template: `<DisplayObjectContainer>
<Bitmap
:x="$stageWidth*0.5"
:y="$stageHeight*0.618"
rotation="35"
anchorOffsetX="75"
anchorOffsetY="125"
:pixelHitTest="pixelHitTest"
:texture="texture"
touchEnabled
@touchBegin="onTouchBegin"
@touchMove="onTouchMove"
@touchEnd="onTouchEnd"
></Bitmap>
<Shape v-if="showDot" ref="shape" :x="dotX" :y="dotY"></Shape>
<TextField ref="label" x="50" y="50" size="28" textAlign="left" textColor="0x000000" type="dynamic" lineSpacing="6" multiline touchEnabled @touchTap.stop="pixelHitTest = !pixelHitTest">
点击穿透检测结果:{{isTouch?'别碰我!!':'还没碰到!'}}
点击穿透检测模式:{{pixelHitTest?'小白鹭透明穿透':'小白鹭无穿透'}}
(轻触文字区切换)
</TextField>
</DisplayObjectContainer>`,
})