dans Android J'ai une vue de texte définie comme ceci:
RxView.clicks(tv).flatMap(tv -> { // another observable which can throw onError. return Observable.error(null); }).subscribe(object -> { Log.d("CLICK", "textview clicked", start activity); }, error -> { Log.d("CLICK", "ERROR"); });
6 Réponses :
Vous pouvez créer un observable pour émettre chaque fois que vous cliquez sur le bouton, puis comptez les temps totaux qu'il a émis et utilisez un filtre afin que votre abonné ne le verra qu'une fois qu'il a émis quatre fois.
Observable<View> buttonObservable = ViewObservable.clicks(initiateButton, false); buttonObservable.count() .filter(count -> (count >= 4)) .subscribe(object -> { //Your code here });
La méthode observable.count code> renvoie simplement le nombre de fois que le
observable code> a émis un élément. Ça fait partie de rxjava
Compte ne peut pas être utilisé ici car il n'aura qu'un article après ses émits observables remplis ( rxmarbles.com/#count < / a>) le clic observable d'autre part est infini
Vous pouvez réaliser avec quelque chose comme ceci: La partie la plus difficile est de spécifier le temps de tampon "fenêtre". Une seconde n'est parfois pas assez, mais dans d'autres cas, l'utilisateur doit attendre peu de millisecondes. P> p>
tampon () code> - Recueillir des clics pour la fenêtre 1S li>
filtre () code> - Filtrer tous les éléments tamponnés émis, où est le nombre d'éléments dans la mémoire tampon non égaux 4 (Désactiver double, triple, quintuple clics) li>
ul>
Qu'est-ce que "CREATE ((Observable.SuCRIDE
@Pablocegarra C'est l'exemple est basé sur rxjava1. Méthode Créer () code> est utilisé lorsque vous avez besoin d'une création d'observable à partir d'un fournisseur (
onclicklistener code> dans ce cas).
Observable.Sublique
flowable code>.
Pouvez-vous mettre à jour votre message à rxjava2 s'il vous plaît? Je vous voterai si cela fonctionne, maintenant im en utilisant rxbinding juste pour cela
@Pablocegarra s'il vous plaît, créez une nouvelle question et spécifiez-y vos exigences. Quelqu'un jette un coup d'oeil.
@skywall Réponse est le plus complet. Toutefois, si vous ne vous souciez pas des intervalles de temps, la réponse la plus simple sera d'utiliser Skip
Observable<Void> fourClicksView = RxView.clicks(tv).skip(3); fourClicksView.subscribe(...);
Cela dépend si vous avez besoin de 4 clics exactement et non plus. La question a été indiquée exactement comme quadruple clic.
La question requise 4, bien sûr, elle peut être modifiée si vous le souhaitez, si vous voulez seulement un événement, vous pouvez également utiliser d'abord () ou prendre (1) après.
Si vous souhaitez démarrer une activité après un certain nombre de clics dans une fenêtre de temps, essayez ceci:
RxView.clicks(tv) .map(e -> SystemClock.elapsedRealtime()) .buffer(NUM_CLICKS, 1) //Grab every sub-sequence of however many clicks .filter(times -> times.size() == NUM_CLICKS) //Last values will be truncated .filter(times -> times.get(NUM_CLICKS - 1) - times.get(0) < ALLOWED_TIME) //check times .subscribe(ignore -> startActivity());
Utilisez le tampon et l'opérateur de débutage.
val clickStream = RxView.clicks(view) clickStream.buffer(clickStream.debounce(250, TimeUnit.MILLISECONDS)) .map { it.size } .filter { it == 4 } .subscribe({ })
Rxview.clicks (vue) .share () - Rxbinding ne fonctionne que avec le dernier auditeur, plus ici Github. COM / Jakewharton / Rxbinding / Problèmes / 146
Pour détecter plusieurs clics avec un délai imparti (par exemple, 4 clics à moins de 1000 ms), le suivant fonctionne bien: dans cet exemple, le tampon code> code> Émettez 4 événements émettant 4 événements, ou émettant moins de 4 événements tous les 1000 ms, qui seront ignorés à cause du filtre code> p> p> p>
C'est plutôt bien, merci, mais n'est-ce pas identique à Zygi?
J'ai essayé celui-là d'être initialement et je ne pouvais pas le faire travailler. Même si cela fonctionnait, cette réponse a eu quelques avantages pour moi: 1. Vous pouvez le faire en une ligne; 2. La version de tampon code> qui inclut le délai d'attente ainsi que les numclicks fonctionne parfaitement pour le scénario "Plusieurs clic"
@Peter Cela attendra une seconde à compléter avant de donner le résultat. Et si je veux obtenir le résultat dès que 4 clics sont effectués dans les 1 seconde période?
@Rishabhjain êtes-vous certain? Selon la documentation de tampon code>, les éléments seront émis lorsque code> tispan code> (délai d'attente dans l'exemple ci-dessus) est atteint ou
compte code> (NumClicks ci-dessus ) est atteint - donc lorsque 4 clics sont reçus dans l'exemple ci-dessus, l'observateur doit être appelé quel que soit le temps écoulé: REACTIVEX.IO/Documentation/OPERATORS/Buffer.html
Vous essayez d'obtenir un clic quadruple ou seulement 4 clics avec une quantité de temps non spécifiée entre eux?
Quadruple Cliquez, mais je peux me contenter de 4 clics avec une limite de temps entre. cela fonctionne aussi bien.