4

無限リストのスクロールをエミュレートしており、1 本の指でスクロールするか、ユーザーがジェスチャを開始するかの違いを検出したいと考えています。

理論的には、IE10 では指の数をイベントごとに +1、イベントごとMSPointerDownに -1 MSPointerUp(および/または event.msPointerId を使用して一致する指) に抑えることができます。

実際には、IE10 が MSPointerDown イベントを生成するが、一致する MSPointerUp イベントを送信しないというバグが少なくとも 1 つあります。(申し訳ありませんが、これを示す簡単なテスト ケースを作成できませんでしたが、MSPointerUp イベントが確実に欠落していることを確認するのに多くの時間を費やしました。おそらく、タッチ中に子要素が削除されたためです)。

おそらく、MSGesture イベントを使用して、複数の指が押されているかどうかを確認しますか? (私はこれを試しましたが、ほとんど成功しませんでしたが、他の誰かが解決した可能性があります)。

何か案は?

PS: Webkit では touchstart イベントをチェックインすることと同等です (これを機能event.touches.length === 1させるには、明白でないトリックが必要であることに注意してください: document.ontouchstart にはイベントが登録されている必要があり、event.touches.length は、登録されている touchstart イベントに対して正しくなります。その他の要素)。

4

1 に答える 1

2

MSPointerOut も追跡していることを確認してください。追跡可能領域の外で画面を離すと、MSPointerUp が呼び出されないことがわかりました。

それが役立つ場合は、マルチタッチの状態を追跡するために使用している WinJS クラスがあります。

var TouchState = WinJS.Class.define(
function () {
    this.pointers = [];
    this.primaryPointerId = 0;

    this.touchzones = [];
}, {
    touchHandler: function (eventType, e) {
        if (eventType == "MSPointerDown") {
            if (!this.pointers[this.primaryPointerId] || !this.pointers[this.primaryPointerId].touching) {
                this.primaryPointerId = e.pointerId;
            }
            e.target.msSetPointerCapture(e.pointerId);
            this.pointers[e.pointerId] = {
                touching: true,
                coords: {
                    x: e.currentPoint.rawPosition.x,
                    y: e.currentPoint.rawPosition.y
                }
            };
            this.checkTouchZones(this.pointers[e.pointerId].coords.x, this.pointers[e.pointerId].coords.y, e);
        }
        else if (eventType == "MSPointerMove") {
            if (this.pointers[e.pointerId]) {
                this.pointers[e.pointerId].coords.x = e.currentPoint.rawPosition.x;
                this.pointers[e.pointerId].coords.y = e.currentPoint.rawPosition.y;
            }
        }
        else if (eventType == "MSPointerUp") {
            if (this.pointers[e.pointerId]) {
                this.pointers[e.pointerId].touching = false;
                this.pointers[e.pointerId].coords.x = e.currentPoint.rawPosition.x;
                this.pointers[e.pointerId].coords.y = e.currentPoint.rawPosition.y;                    
            }
        }
        else if (eventType == "MSPointerOut") {
            if (this.pointers[e.pointerId]) {
                this.pointers[e.pointerId].touching = false;
                this.pointers[e.pointerId].coords.x = e.currentPoint.rawPosition.x;
                this.pointers[e.pointerId].coords.y = e.currentPoint.rawPosition.y;
            }
        }
    },
    checkTouchZones: function (x, y, e) {
        for (var zoneIndex in this.touchzones) {
            var zone = this.touchzones[zoneIndex];
            if (x >= zone.hitzone.x1 && x < zone.hitzone.x2 && y > zone.hitzone.y1 && y < zone.hitzone.y2) {
                zone.callback(e);
            }
        }
    },
    addTouchZone: function (id, hitzone, callback) {
        this.touchzones[id] = {
            hitzone: hitzone,
            callback: callback
        };
    },
    removeTouchZone: function (id) {
        this.touchzones[id] = null;
    }
});
于 2013-02-08T04:31:22.943 に答える