2013-10-17 1 views
2

rxjs를 가지고 놀았습니다. 나는 그것을 정말로 좋아한다. 그러나 정말로 그것 주위에 나의 머리를 알아들을 약간의 시간이 걸렸다. 여기 제가 해결할 수없는 작은 문제가 있습니다. 그래서 나는 통찰력을 찾고 있습니다. {: X, Y : Y, t : t, current_pointers : ID :, X}rxjs를 사용하여 멀티 터치 장시간 이벤트 감지

싶습니다 각각 touchstart /하는 TouchMove/touchend와 객체를 PARAMS 당신이 것을위한 곳

는 멀티 터치 인터페이스를 고려 touchmove 또는 touchup이 해당 포인터에 대해 발생하지 않는 한 1500ms 후 각 다운 포인터에 대한 이벤트를 트리거하는 관찰 가능 개체입니다.

단 한번의 터치의 경우 터치가 이동하거나 터치 업 할 때까지 걸릴 수 있지만 포인터의 ID가 체인의 첫 번째 관찰 가능 범위 내에있는 경우 takeUntil을 어떻게 사용합니까?

답변

3

터치 배열을 평평하게하면 터치를 개별적으로 처리 할 수 ​​있습니다. 다음은 Rx-jQuery 바인딩을 사용하는 기본적인 아이디어이다. 나는 그것을 테스트하지 않았기 때문에 약간 버그가있을 수있다.

var flattenTouches = function (ev) { 
    return ev.changedTouches.map(function(t) { return { ev: ev, touch: t }; }); 
}; 
var starts = $element.bindAsObservable("touchstart") 
    .selectMany(function (ev) { return Rx.Observable.fromArray(flattenTouches(ev)); }); 
var moves = $element.bindAsObservable("touchmove") 
    .selectMany(function (ev) { return Rx.Observable.fromArray(flattenTouches(ev)); }) 
    .publish().refCount(); // to prevent multiple subscriptions 
var ends = $element.bindAsObservable("touchend") 
    .selectMany(function (ev) { return Rx.Observable.fromArray(flattenTouches(ev)); }) 
    .publish().refCount(); // to prevent multiple subscriptions 

var moveOrEnds = Rx.Observable.mergeObservable(moves, ends); 
var timer = Rx.Observable.timer(1500); 

var longpresses = starts 
    .selectMany(function (start) { 
     var thisPointerMovesOrEnds = movesOrEnds.where(function(t) { 
      return t.touch.identifier === start.touch.identifier; 
     }); 
     return timer 
      .takeUntil(thisPointerMovesOrEnds) 
      .select(start); 
    }); 

longpresses.subscribe(function (t) { 
    console.log("longpress", t.touch.pageX, t.touch.pageY, t.touch.identifier); 
}); 
+0

Thx, 내가 잃어버린 것은 타이머 비트 였고 타이머를 사용해야했을 때 터치 다운을 다시 사용하는 경향이 있었다. 고마워. – trokster

+0

이것이 RxJS에서 어렵다고 생각하는 것입니다. 사양에 따르면 하나의 인수 만있는 타이머는 하나의 이벤트 만 생성합니다. 이것을 가정하면 어떻게 될까요? 실제로 타이머를 시작하는 것은 무엇입니까? 여러 이벤트는 어떻게 생성됩니까? – bnieland

+1

@bnieland Timer는 구독 후 * 이벤트를 하나만 생성하는 관찰 가능 객체를 만듭니다. 구독 할 때마다 나중에 이벤트를 생성하는 새 타이머가 시작됩니다. 구독 행위는 타이머를 시작하는 것이며 모든 구독은 다른 모든 구독과 독립적입니다. 타이머는 "차갑게 관찰 가능한"것으로 알려져 있습니다. 이에 대한 더 나은 처리를 위해 "콜드 (cold)"및 "핫 (hot)"관측 가능성에 대해 읽어보십시오. – Brandon

관련 문제