Je travaille pour une fondation qui sensibilise à l'accessibilité sur Internet. Pour une présentation, nous voulons offrir un petit atelier qui simule différents handicaps / déficiences aux gens. Cela se fait via un site internet créé spécialement pour cette présentation.
L'une des déficiences démontrées est d'avoir un tremblement, ce qui signifie ressentir des mouvements de la main tremblants et difficiles à contrôler. Avec cette déficience, il est très difficile de déplacer exactement le curseur de la souris et d'appuyer sur le bouton de la souris pendant que la souris se trouve sur un lien. Certaines personnes âgées et certaines personnes atteintes de maladie, par exemple la maladie de Parkinson, peuvent souffrir de tremblements.
Maintenant, j'aimerais déplacer le curseur de la souris d'une manière imprévisible, de sorte qu'il est très difficile pour les gens de cliquer sur un petit bouton. Parce que JavaScript ne permet pas de déplacer directement le curseur de la souris, je cherche d'autres moyens d'y parvenir. Je suis venu avec les idées suivantes:
- Utilisation d'un pilote / utilitaire de souris qui simule le tremblement de la souris.
- Masquez le curseur de la souris via CSS, placez une animation GIF d'un curseur de souris tremblant à l'emplacement du curseur d'origine (avec JavaScript), puis rendez le lien cible cliquable uniquement toutes les quelques secondes pendant une seconde environ. Cela donnerait au moins l'impression que l'on clique toujours au mauvais moment.
Alors que la première idée serait plutôt cool, je n'ai pas pu trouver un outil comme celui-ci, que ce soit pour Mac ou pour Windows. Et je n'ai aucune compétence pour programmer une telle chose moi-même.
La deuxième idée semble un peu maladroite, mais elle donnerait l'effet souhaité, je pense.
Quelqu'un a-t-il une autre idée?
la source
Réponses:
J'ai fait une démonstration rapide de quelque chose sur lequel vous devriez pouvoir espérer baser votre code, en utilisant l' API Pointer Lock .
J'ai fourré ce dépôt de démonstration de verrouillage de pointeur et l' ai modifié pour ajouter un élément de mouvement aléatoire.
Voici le lien vers ma page GitHub: https://aristocrates.github.io/pointer-lock-demo
Et voici le lien vers mon repo: https://github.com/aristocrates/pointer-lock-demo
Le code javascript d'importance est contenu dans
app.js
, dans lacanvasLoop(e)
méthode.La seule chose que j'ai changé par rapport à la démo originale était après les lignes
J'ai ajouté deux lignes pour représenter un mouvement aléatoire:
Il y a encore beaucoup de choses que vous pourriez améliorer, mais j'espère que cela peut vous aider à démarrer.
la source
Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.
. Il semble que jsFiddle incorpore le contenu dans un cadre bac à sable (c'est-à-dire ne permettant pas le verrouillage du pointeur via<iframe sandbox="webkit-allow-pointer-lock">
, voir la documentation ). Essayez de mettre l'exemple sur une seule page, pas en bac à sable.Manière non javascript
En fait, j'aime les solutions, qui peuvent être basées sur javascript, car elles sont plus probablement liées au Web, et les bonnes chances sont - indépendantes du système d'exploitation. Cependant, je réfléchissais à - comment résoudre votre problème pour tous les navigateurs, car les solutions javascript, dans ce cas, seront difficiles à ajuster pour tous les navigateurs possibles (je ne suis pas sûr que ce soit possible).
Ainsi, comme vous l'avez mentionné, il existe un autre moyen - à savoir émuler le comportement au niveau du système d'exploitation. Cela a aussi un autre avantage - vous pouvez être sûr que pour le navigateur, il semble à 100% comme il était humain (car, bien, c'est le pilote qui envoie le signal). Vous pouvez donc utiliser des solutions basées sur les pilotes / périphériques avec tous les navigateurs (ou même en situation, lorsque javascript est désactivé).
Linux
Malheureusement, l'implication du pilote / périphérique entraîne immédiatement une dépendance au système d'exploitation. Ainsi, pour chaque système d'exploitation, vous aurez besoin de votre propre solution. Dans cet article, je me concentre sur une solution basée sur Linux (donc, cela fonctionnera avec Linux) - et Mac OS un peu. Avec Linux, il est possible d'écrire des événements sur le périphérique de manière explicite, voici donc un exemple de fonction avec boucle principale:
Mon code complet pour le problème se trouve ici . Le programme demandera l'amplitude du "tremblement" et sa fréquence (ainsi, combien de temps en micro-secondes sont entre les "tremblements"). Pour émuler la situation, il forcera la souris à se déplacer aléatoirement pour des
0..X
points dans une direction aléatoire (haut-bas-gauche-bas) et attendra aléatoirement des0..Y
micro-secondes jusqu'au prochain "tremblement", ilX
y a une amplitude de "tremblement" et uneY
fréquence de "tremblement" "Une autre chose peut être d'adapter le programme à votre système. Le programme est "factice" et ne peut pas détecter la souris par lui-même, il
"/dev/input/event4"
est donc codé en dur. Pour réaliser ce qui peut être l'identifiant de votre système, vous pouvez essayer:Et donc les possibilités sont
"event3"
et"event4"
- mais pour votre système qui peut avoir d'autres valeurs. Donc, si cela est différent de celui actuellement utilisé dans le code C, changez simplement la ligne correspondante (donc, ligne avecint fd = open("/dev/input/event4", O_RDWR);
et placez votre appareil à la place deevent4
)Une démo gif pour ce programme (faible taux de trame, malheureusement, donc gardez l'image pas trop grande) ici .
Une petite note (si vous ne savez pas quoi faire avec le code C) - pour compiler le programme ci-dessus, utilisez simplement:
où
file.c
est le nom de votre fichier de code source C, vous obtiendrez alors l'exécutable, appelém
dans votre répertoire. Vous aurez probablement besoin d'autorisations pour écrire directement sur le périphérique de la souris, vous pouvez donc utilisersudo
:Autre OS
La logique restera la même:
C'est tout. Par exemple, Mac OS a sa propre façon de travailler avec la souris (pas comme Linux, Mac non
procfs
plus), c'est bien décrit ici .Comme conclusion
Ce qui est mieux - javascript ou solutions orientées appareil - dépend de vous, car certaines conditions (comme cross-browser ou cross-OS) peuvent tout décider dans ce cas. Par conséquent, j'ai fourni des directives ainsi qu'un certain exemple de travail sur la façon de l'implémenter au niveau du système d'exploitation. L'avantage ici est que la solution est multi-navigateur, mais en tant que coût, nous avons un programme lié au système d'exploitation.
la source
J'ai fait cela comme une blague une fois, sur le Puppy Linux Forum et j'ai obtenu le commentaire suivant:
Voici le script shell qui nécessite xdotool
Nommez parkinson_sim et exécutez avec un argument facultatif pour le temps entre les tremblements qui peut être de 0,001 à 999,0.
J'ai fait l'erreur de cliquer dessus moi-même au lieu de l'exécuter à partir de la ligne de commande et j'ai rapidement découvert à quel point cela devait être frustrant. Il m'a fallu plusieurs tentatives pour ouvrir une fenêtre de terminal pour le tuer.
la source
`
dans une fenêtre ROX-Filer. Il a fallu quelques essais pour l'ouvrir, j'ai donc utilisé le clavier pour ouvrir le menu. Peu de temps après, j'ai créé un démon de contrôle vocal rudimentaire utilisant des pochesphinx_continuous et environ 10 lignes de shell.while :; do ...; sleep $time; done
devrait presque toujours l'êtrewhile sleep $time; do ...; done
, car lorsque l'utilisateur appuie sur Ctrl-C, la commande en cours d'exécution le sera presque certainementsleep
, et les shells ne terminent pas toujours le script lorsque l'utilisateur le souhaite. Cela se produit notamment lors des tests dans des shells interactifs, mais cela peut parfois se produire même dans des scripts. Ce serait encore mieuxwhile xdotool ... && xdotool ... && sleep ...; do :; done
.Votre deuxième idée (cacher le curseur) est à mi-chemin de celle qui, je pense, peut bien fonctionner pour vous:
cursor:none
IIRC)Ensuite, vous ajoutez des maths tremblements à votre code de curseur, pour "secouer" le curseur. À vous de déterminer quelles sont les bonnes courbes pour simuler correctement l'entrée du tremblement.
Enfin: pour tous les contrôles que vous programmez (liens, etc.):
Un avantage majeur avec cette implémentation: votre «curseur tremblant» sera affiché sur les appareils tactiles, qui n'auraient pas de curseur pour commencer.
Éditer:
Basé sur la base JSFiddle de Michael Theriot (très propre et utile!) Des commentaires, en voici une qui tremble constamment avec un balayage normalement distribué autour de l'emplacement actuel du curseur: http://jsfiddle.net/benmosher/0x4mc64v/4/
(Le
normal
tableau est le résultat de l'appelrnorm(100)
dans ma console R. La manière la plus simple à laquelle je pouvais penser dans JS pour échantillonner un entier aléatoire normalement distribué.)la source
Juste une idée pour obtenir le "tremblement" droit, vous pouvez enregistrer le mouvement de la souris d'un vrai patient, cela le rend plus authentique lorsque vous dites aux gens d'où viennent les données.
Il y a des scripts pour laisser un chat suivre le curseur de votre souris, vous pouvez en ajuster un pour laisser un second curseur suivre (sauter) votre curseur. La page calcule la position du deuxième curseur, de sorte qu'elle peut également déterminer si un événement de clic a réussi ou non.
Si vous le pouvez, veuillez le faire sur le Web, vous atteindrez beaucoup plus de gens de cette façon que de leur demander d'installer un programme ou d'activer Flash ou quoi que ce soit.
la source
Au lieu d'essayer de déplacer le pointeur, vous pouvez déplacer l'application (page Web) à la place. J'ai écrit un simple formulaire html qui contient des champs de saisie. Lorsque vous déplacez la souris sur le formulaire, le formulaire se déplace.
Vous pouvez voir une démo de la forme en mouvement sur jsfiddle . Essayez de cliquer sur l'un des champs de saisie pour voir l'effet.
J'ai utilisé l' effet jquery shake pour y parvenir. Le javascript de l'effet de secousse ressemble à ceci, et fait simplement bouger le formulaire de haut en bas chaque fois que la souris est déplacée dessus:
Bien que le formulaire ne se déplace que de haut en bas, je pense qu'il a l'effet souhaité. Vous pouvez jouer avec les paramètres (direction, temps, distance, ainsi que le "1000" sans nom ci-dessus) pour modifier le mouvement de la forme.
la source
Pourquoi ne pas utiliser une solution matérielle? Il existe certaines souris dans lesquelles vous pouvez mettre des poids, comme le Logitech G500. Au lieu de mettre un poids, installez un petit moteur oscillant qui fait trembler légèrement la souris. Cela simulait également davantage le désordre réel: ce n'est pas seulement le curseur qui tremble, mais toute la main et la souris. Et cela signifie également que vous pouvez afficher d'autres logiciels que des sites Web.
Au lieu d'une souris avec une fente de poids, vous pouvez également coller quelque chose à la souris, mais c'est plus visible.
la source
Comme vous envisagiez de le faire avec un pilote de souris personnalisé, je suppose qu'un petit programme exécuté sur le PC ferait non plus? Si tel est le cas, voici un petit extrait pour C #, qui déplace infiniment le curseur de manière aléatoire avec une plage de plus moins 5 px autour de la position actuelle du curseur. Après chaque déplacement, le programme attend de 50 à 100 ms (pas précis!). Le tremblement peut être configuré en adaptant les valeurs du déplacement et des pauses. J'ai exécuté cela dans une application console et - selon les valeurs - cela m'a donné beaucoup de mal à arrêter le programme.
la source
Voici une version Windows de mon script xdotool qui utilise AutoIt . C'était mon tout premier script AutoIt, et il n'a fallu que quelques minutes pour l'écrire, donc je suis sûr qu'il peut être amélioré. Enregistrez simplement avec l'extension .au3 et exécutez-le avec AutoIt (Run Script x86).
Contrôles
Ou utilisez ma version compilée d' ici .
la source
Vous ne pouvez pas vous attendre à ce que quiconque puisse tenir ses mains parfaitement stables, donc une chose que vous pouvez considérer est,
Mon raisonnement est (mise en garde, je ne suis pas un expert en ux ou en médecine) en rendant les éléments cliquables plus petits, vous créez un problème similaire pour la plupart des gens qu'une personne atteinte de la maladie de Parkinson ferait face à un site Web de tous les jours.
la source
Vous pouvez utiliser une combinaison de simulation de vieillesse, comme celle décrite dans cet article ... Je soupçonne que la partie des tremblements des mains est juste un moteur vibrant attaché autour du poignet, plus quelques gants épais pour rendre les mains généralement maladroites.
la source
DIV
, CSS-cachez le curseur en utilisantcursor:none;
left
,top
) avec jQ activémousemove
margin-left
etmargin-top
utilisez unsetTimeout
(pour rendre le repositionnement fluide, utilisez CSS3transition
ou faites-le avec jQ.animate()
).Remarque: le script ne peut pas savoir si la main est toujours sur la souris;)
la source
Les parties de bas niveau de simulation du tremblement sont maintenant bien répondues. Je vais ajouter quelque chose en se concentrant sur le type de tremblement à simuler:
La plupart des réponses implémentent un curseur de souris qui se déplace sur un chemin aléatoire avec une largeur de pas maximale fixe dans les directions X et Y.
Cela devrait fonctionner assez bien pour le cas d'utilisation où il est difficile de frapper une zone spécifique comme un bouton.
Pour le problème plus général de la simulation de problèmes d'interface utilisateur causés par un tremblement de la maladie de Parkinson, il serait au moins intéressant de simuler réellement les mouvements de la main de ce type de tremblement.
Je soupçonne que la marche aléatoire n'est peut-être pas une très bonne approximation .
Bien sûr, il peut être difficile d'obtenir des données de trace de la main réelle du mouvement de tremblement, mais il existe certainement des documents sur l'analyse de ce type de tremblement:
L'article Représentation paramétrique du mouvement de la main dans la maladie de Parkinson explique comment tracer au mieux les traces de mouvement de la main en 3D.
Le papier est paywalled, mais l'aperçu en haut à droite, intitulé "Look Inside>" sur l'image du livre, montre quelques tracés intéressants de différentes représentations des données de trace de la main .
la source