Bir web sayfasında fare ile titreme (örneğin Parkinson Hastalığı) simüle?


204

İnternette erişilebilirlik konusunda farkındalık yaratan bir vakıf için çalışıyorum. Bir sunum için, insanlara farklı engelleri / bozuklukları simüle eden küçük bir atölye sunmak istiyoruz. Bu, özellikle bu sunum için oluşturulmuş bir web sitesi aracılığıyla yapılır.

Gösterilen bozukluklardan biri titreme, titrek, kontrolü zor el hareketleri yaşamak anlamına geliyor. Bu bozulma ile fare imlecini tam olarak hareket ettirmek ve fare bir bağın üzerindeyken fare düğmesine basmak çok zordur. Hem bazı yaşlı insanlar hem de hastalığı olan insanlar, örneğin Parkinson, titremeden muzdarip olabilir.

Şimdi bir şekilde fare imlecini tahmin edilemez bir şekilde hareket ettirmek istiyorum, böylece insanların küçük bir düğmeyi tıklamaları çok zor. JavaScript fare imlecinin doğrudan hareket etmesine izin vermediğinden, bunu başarmanın başka yollarını arıyorum. Aşağıdaki fikirleri buldum:

  • Fare sarsıntısını taklit eden bir fare sürücüsü / yardımcı programı kullanma.
  • Fare imlecini CSS ile gizleyin, sallanan fare imlecinin GIF animasyonunu orijinal imlecin (JavaScript ile) üzerine yerleştirin ve hedef bağlantıyı birkaç saniyede bir saniye kadar tıklatılabilir hale getirin. Bu, en azından biri her zaman yanlış anda tıklıyormuş gibi bir his verecektir.

İlk fikir oldukça havalı olsa da, Mac veya Windows için böyle bir araç bulamadım. Ve böyle bir şeyi kendim programlama konusunda hiçbir yeteneğim yok.

İkinci fikir biraz beceriksiz gözüküyor, ama bence istenen etkiyi başaracaktı.

Başka bir fikri olan var mı?



2
Developer.mozilla.org/en-US/docs/Web/API/… adresine bakmayı deneyin . Demoya doğrudan bağlantı mdn.github.io/pointer-lock-demo . Kullanıcılara bir tuvale tıklamayı söylemek ve sayfanın fare imlecini devre dışı bırakmasına izin vermek amacınız kabul edilebilir olduğu sürece, kodunuzu buna dayandırmak isteyebilirsiniz
Aristocrates

5
Asıl soru, web geliştiricileri arasında farkındalığı artırıyor. Sorduğunuz için teşekkürler! Bir düğmenin tıklanabilir olması için ne kadar büyük olması gerektiğini düşünüyorsunuz?
İdeogram

4
Sadece titreme konusunda bir seviye belirlendi: "Temel titreme" ve Parkinson titremesi olmak üzere iki temel türü vardır ve bunlar tamamen farklıdır. "Temel titreme" ( sadece yaşlıların bir şartı değildir ), bir "niyet" titremesidir, yani sadece birey bir şey yapmaya çalıştığında aşikar ve birey onu kontrol etmeye çalıştıkça daha da kötüleşir. Öte yandan, PD tremoru öncelikle istirahatte ortaya çıkar ve birey bir şey yapmaya çalıştığında titreme genellikle belirgin değildir (PD'ye bağlı sertlik iyi olabilir).
Hot Licks

2
Fareyi kontrol etmek için xdotool kullanan bir linux sürümü yayınladım, ancak autoit adı verilen pencereler için benzer bir araç var. Oldukça basit görünüyor ve bunun için bir etiket bile var [autoit]. Ayrıca 2 versiyona ihtiyacınız var gibi geliyor. Hareket başlayana kadar daha fazla sallanan ve sonra biraz sakinleşirken diğeri hareket başlayana kadar nispeten kararlıdır.
technosaurus

Yanıtlar:


148

İşaretçi Kilidi API'sını kullanarak kodunuzu dayandırabileceğiniz bir şeyin hızlı bir demosunu yaptım .

Ben çatallı bu işaretçi-lock-demo repo ve rastgele hareket elemanı eklemek için güncellenmiştir.

GitHub sayfamın bağlantısı: https://aristocrates.github.io/pointer-lock-demo
Ve işte repo'mın bağlantısı: https://github.com/aristocrates/pointer-lock-demo

Javascript önemli kodu app.js, canvasLoop(e)yöntemde yer almaktadır.

Orijinal demodan değiştirdiğim tek şey satırlardan sonraydı

x += movementX * 2;
y += movementY * 2;

Rastgele hareketi temsil etmek için iki satır ekledim:

x += Math.floor(Math.random()*3 - 1);
y += Math.floor(Math.random()*3 - 1);

Hala geliştirebileceğiniz çok şey var, ama umarım bu başlamanıza yardımcı olabilir.


36
İşlevselliğin bir notu olarak, rastgele hareket titreyen bir el ile aynı değildir. Rasgele hareketle işaretçi ekran boyunca kayabilir. Sallanan bir el ile işaretçi merkezi bir nokta etrafında titreyecektir.
zzzzBov

5
Pointer Lock Api için tarayıcı desteğinin harika olmadığını belirtmek gerekir - bu Internet Explorer veya Safari'de çalışmaz.
Steve Sanders

3
Kendim denemek için zaman bulamadım, ama belki bunu biliyorsunuz: işaretçi kilidi API'si bir tuval dışında da çalışıyor mu? Yoksa bir tuvalle mi sınırlı?
Joshua Muheim

8
Daha gerçekçi bir uygulama, imlecin "gerçek" konumunu izler ve bunun etrafında bir daire içinde rastgele hareket eder, ancak bu çok karmaşık olabilir.
tckmn

1
@Chris Chrome şimdi atıyor Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.. Görünüşe göre jsFiddle içeriği korumalı bir çerçeveye yerleştiriyor (yani işaretçi kilidine izin vermiyor <iframe sandbox="webkit-allow-pointer-lock">, belgelere bakın ). Örneği korumalı alan yerine tek bir sayfaya koymayı deneyin.
ComFreek

36

Javascript olmayan yol

Aslında, javascript tabanlı olabilecek çözümleri seviyorum, çünkü daha fazla web bağlantılı ve iyi şanslar - işletim sisteminden bağımsız. Ancak, düşündüm - tüm tarayıcılar için sorununuzu nasıl çözeceğiniz, çünkü javascript çözümlerinin, bu durumda, tüm olası tarayıcılar için ayarlanması zor olacaktır (mümkün olup olmadığından emin değilim).

Dediğiniz gibi, başka bir yol var - yani OS seviyesinde davranışı taklit etmek. Bunun başka bir avantajı daha var - tarayıcı için insan gibi% 100 göründüğünden emin olabilirsiniz (çünkü, sinyali gönderen sürücüdür). Bu nedenle, herhangi bir tarayıcıda (veya javascript devre dışı bırakıldığında bile) sürücü / aygıt tabanlı çözümler kullanabilirsiniz.

Linux

Ne yazık ki, sürücüyü / aygıtı dahil etmek derhal işletim sistemine bağımlılığa neden olur. Yani her işletim sistemi için kendi çözümüne ihtiyacınız olacak. Bu yazıda Linux tabanlı çözüme odaklandım (yani Linux ile çalışacak) - ve Mac OS biraz. Linux ile cihaza olayları açıkça yazmak mümkündür, bu yüzden aşağıda ana döngü ile fonksiyon örneği verilmiştir:

int main()
{
    struct input_event event, event_end;

    int  fd = open("/dev/input/event4", O_RDWR);
    long ma = getInteger("Enter max amplitude [points, 0..50]: ", 0, 50);
    long ta = getInteger("Enter max wait time [usecs , 0..200000]: ", 0, 200000);
    if (fd < 0)
    {
        printf("Mouse access attempt failed:%s\n", strerror(errno));
        return -1;
    }
    memset(&event, 0, sizeof(event));
    memset(&event, 0, sizeof(event_end));
    gettimeofday(&event.time, NULL);
    event.type = EV_REL;
    gettimeofday(&event_end.time, NULL);
    event_end.type = EV_SYN;
    event_end.code = SYN_REPORT;
    event_end.value = 0;
    while(1)
    {
        event.code  = rand() % 2 ? REL_X : REL_Y;
        event.value = (rand() % 2 ? -1 : 1) * randomTill(ma);
        write(fd, &event, sizeof(event));
        write(fd, &event_end, sizeof(event_end));
        usleep(randomTill(ta));
    }
    close(fd);
    return 0;
}

Benim tam kod sorunu için bulunabilir buraya . Program, "titreme" nin genliğini ve sıklığını soracaktır (bu nedenle, "titreme" arasında mikro saniyede kaç zaman vardır). Durumu taklit etmek için, fareyi 0..Xrastgele yönde (yukarı-aşağı-sol-alt) noktalar için rastgele hareket etmeye zorlar ve bir 0..Ysonraki "titreme" ye kadar rasgele mikro saniye bekler X, "titreme" genliği vardır veY frekansıdır "

Başka bir şey, programı sisteminize uyarlamak olabilir. Program "kukla" ve fare kendi başına algılayamaz, bu yüzden "/dev/input/event4"sabit kodlanmıştır. Sisteminiz için neyin tanımlayıcı olabileceğini anlamak için deneyebilirsiniz:

user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3 
H: Handlers=mouse1 event4

Ve böylece olasılıklar "event3"ve "event4"- ancak sisteminiz için başka değerlere sahip olabilir. Bu, şu anda C kodunda kullanılmakta olandan farklıysa, karşılık gelen satırı değiştirin (yani, satır int fd = open("/dev/input/event4", O_RDWR);yerine ve cihazınızı yerine yerleştirin event4)

Bu program için bir gif demo (düşük kare hızı, maalesef, bu nedenle görüntüyü çok büyük değil tutmak) burada .

Küçük bir yan not (C kodu ile ne yapacağınızı bilmiyorsanız) - yukarıdaki programı derlemek için şunları kullanın:

user@host:/path$ gcc -std=gnu99 file.c -o m

file.cC kaynak kodu dosyanızın adı nerede ise, mdizininizde çağrılan yürütülebilir dosyayı alırsınız . Büyük olasılıkla doğrudan fare cihazına yazmak için izinlere ihtiyacınız olacaktır, bu nedenle şunları kullanabilirsiniz sudo:

user@host:/path$ sudo ./m

Diğer İşletim Sistemleri

Mantık aynı kalacaktır:

  • Fare cihazınıza erişmenin bir yolunu bulun
  • Hareketli fare yazma olayı
  • Etkinliğinize rastgele uygulama uygulayın

Bu kadar. Örneğin, Mac OS'nin fare ile çalışmak için kendi yolu vardır (Linux gibi değil, Mac de yoktur procfs), burada iyi tanımlanmıştır .

Sonuç olarak

Daha iyisi - javascript veya cihaz odaklı çözümler - size bağlıdır, çünkü belirli durum (çapraz tarayıcı veya çapraz işletim sistemi gibi) bu durumda her şeye karar verebilir. Bu nedenle, işletim sistemi düzeyinde nasıl uygulanacağına dair bazı çalışma örnekleri ile birlikte yönergeler sağladım. Buradaki fayda, çözümün çapraz tarayıcı olmasıdır, ancak maliyet olarak işletim sistemine bağlı programımız var.


Bu çok ayrıntılı gönderi için çok teşekkürler. Bir tablette (android veya ios) göstereceğimizden şüpheleniyorum, bu nedenle fare davranışını işletim sistemi düzeyinde değiştiremeyiz. Ama yine de çok ilginç!
Joshua Muheim

53
Dokunmatik ekranlı cihazlarda titrek bir fareyi nasıl göstereceksiniz?
Davor

6
@Dürüst olmak gerekirse, kasıtlı olarak kendilerini deli etmek istemedikçe, titreme / titrek ellerle gerçekten sorun yaşayan insanların bir dokunmatik cihaz kullanacağından şüpheliyim .
Chris Cirefice

2
@ChrisCirefice: Ya da zorlanıyorlar, çünkü hayatımızı daha güzel hale getirmek ve dokunmatik ekranları kullanmak için olan gazillion cihazlarından birini kullanmak zorundalar ... söyledi.
PlazmaHH

@ PlazmaHH OP, bunun titreme ve (özellikle) dokunmatik ekranlı cihazlarda zorluk çeken insanlar için farkındalığı artırmak olduğunu söylemedi. Ve yine, aslında titreme ile ilgili sorunları olan kimsenin el tipi dokunmatik ekranlı cihazları kullanmaya çalışacak kadar mazoşist olduğunu düşünmüyorum . Büyük (mekanik) düğmelere sahip telefonlar gibi kullanımı çok daha kolay cihazlar var. Çoğu işletim sistemi konuşmaya göre gezinmeyi içerir (örn. Konuşma Tanıma - Windows İşletim Sistemi). Ciddi derecede rahatsız olan kişilerin iPhone yerine bu araçları kullanacağını hayal ediyorum.
Chris Cirefice

23

Bunu bir kez, Puppy Linux Forum'da bir şaka olarak yaptım ve şu yorumu aldım:

Parkinson hastaları komik olduğunu düşünmeyecek !!!

Burada tedavi sadece cntrl-C, neyse ki.

İşte xdotool gerektiren kabuk betiği

#!/bin/sh
while :; do
   xdotool mousemove_relative -- -$(($RANDOM % 10)) $(($RANDOM % 10))
   xdotool mousemove_relative -- $(($RANDOM % 10)) -$(($RANDOM % 10))
   sleep ${1:-.1} #adjust this as necessary for effect
done

Parkinson_sim olarak adlandırın ve titreme arasında 0.001 ila 999.0 olabilen süre için isteğe bağlı argüman ile çalıştırın.

parkinson_sim [time_between_tremors_in_seconds] # varsayılan 0,1'dir

Komut satırından çalıştırmak yerine üzerine tıklamakla hata yaptım ve ne kadar sinir bozucu olması gerektiğini çabucak keşfettim. Onu öldürmek için bir terminal penceresi açmak birkaç denememi aldı.


1
cpu kullanımını ve hızını sınırlamak için iki nokta üst üste "uyku 0.01" gibi bir şeyle değiştirmek isteyebilirsiniz, çünkü teçhizatımda kodunuzla gerçekçi olmayan hızlı atlamalar yapar.
nonchip

1
@nonchip - Bilgi için teşekkürler, cpu kullanımını bulmak için yeterince uzun sürmedim. Vücuda bir uyku eklendi.
technosaurus

Çoğu Linux dağıtımında terminali klavye komutlarını kullanarak açabileceğinizi biliyorsunuz, değil mi?
justhalf

@justhalf O anki varsayılan Puppy'de, terminal kısayolu `bir ROX-Filer penceresinde basmaktı . Açmak için birkaç deneme aldı, bu yüzden menüyü açmak için klavyeyi kullandım. Kısa bir süre sonra, pocketsphinx_continuous ve yaklaşık 10 satır kabuk kullanarak temel bir ses kontrolü arka plan programı oluşturdum.
technosaurus

while :; do ...; sleep $time; donehemen hemen her zaman olmalıdır while sleep $time; do ...; done, çünkü kullanıcı Ctrl-C'ye bastığında, şu anda yürütülen komut neredeyse kesinlikle olacaktır sleepve kabuklar kullanıcı istediği zaman komut dosyasını her zaman sonlandırmaz. Bu en belirgin şekilde etkileşimli kabuklarda test sırasında olur, ancak bazen komut dosyalarında bile olabilir. Daha da iyisi olurdu while xdotool ... && xdotool ... && sleep ...; do :; done.

16

İkinci fikriniz (imleci gizleyin) sizin için iyi çalışabileceğini düşündüğüm fikirlerin yarısıdır:

  • Önerdiğiniz gibi fare imlecini CSS ile gizleyin. ( cursor:noneIIRC)
  • Titrek bir imleç GIF yerine, fare işaretçisini taklit etmek için bazı görüntü + CSS mutlak konumlandırma + JS kullanın; yani, fareyi sayfanın etrafında takip edin ve imleç görüntüsünü doğal olarak fare imlecinin bulunduğu yere yerleştirin.

Ardından, imleci "sallamak" için imleç kodunuza biraz titreme matematiği eklersiniz. Titreme girdisini doğru şekilde simüle etmek için doğru eğrilerin ne olduğunu belirlemek size kalmış.

Son olarak: hangi kontrolleri programlıyorsanız (bağlantılar vb.):

  • tıklama olaylarını yakalayın, onları titreme eğrilerinizin durumuna bağlı olarak geçerli "titreme" konumuna sürükleyin ve kullanıcının amaçlanan öğeden çıkıp çıkmadığını veya muhtemelen amaçlanmayan bir öğeye girip girmediğini görmek için öğelerinizi kontrol edin .

Bu uygulamayla ilgili büyük bir bonus : 'titrek imleciniz', başlangıçta imleci olmayacak olan dokunmatik cihazlarda görüntülenecektir.


Düzenle:

Michael Theriot'un (çok temiz ve yararlı!) Temel JSFiddle yorumlarından dayanarak, mevcut imleç konumu çevresinde normal olarak dağıtılmış bir süpürme ile sürekli titreyen bir örnek: http://jsfiddle.net/benmosher/0x4mc64v/4/

( normalDizi, rnorm(100)R konsoluma çağrı yapmanın sonucudur . JS'de normal olarak dağıtılmış rasgele bir tamsayıyı örneklemenin en basit yolu.)


Bazı standart JS fare olay bilgisi: javascript.info/tutorial/…
Ben Mosher

Teşekkür ederim, bu gerçekten benim fikrim için çok değerli bir ektir.
Joshua Muheim

Üzerinde çalıştığım bir proje için keman güzel, bu 4 yaşında olmasına rağmen, bunu projemin bir parçası olan Parkinson simülasyonunun temeli olarak çalmamı ister misiniz?
Graham Ritchie

@GrahamRitchie: benimle iyi, ama Michael Theriot işin çoğunu yaptı, IIRC 😄
Ben Mosher

14

Sadece titremeyi "doğru" yapmak için bir fikir, gerçek bir hastanın fare hareketini kaydedebilirsiniz, bu da insanlara verilerin nereden geldiğini söylediğinde daha otantik hale getirir.

Bir kedinin fare imlecinizi takip etmesine izin veren bir komut dosyası var, ikinci bir imlecin imlecinizi takip etmesine (etrafında atlamasına) izin vermek için bir komut dosyası ayarlayabilirsiniz. Sayfa ikinci imlecin konumunu hesaplar, böylece bir tıklama etkinliğinin başarılı olup olmadığını da belirleyebilir.

Yapabiliyorsanız, lütfen web tabanlı yapın, bu şekilde bir program yüklemelerini veya flash'ı veya varsa ne varsa etkinleştirmelerini istemekten çok daha fazla kişiye ulaşacaksınız.


Bu öneri için teşekkürler.
Joshua Muheim

1
Bu fikri beğendim - fare konumu JavaScript aracılığıyla herhangi bir zaman aralığında kaydedilebilir. Daha sonra hareketleri (XY düzlemi) çizebilir ve hatta Pointer Lock API çözümü veya benzeri bir şey için daha 'geçerli' bir 'tremor_randomness' formülü için bazı temel istatistikler elde edebilirsiniz. Bu biraz daha fazla çalışma (örneğin her 100 ms'de 10 saniye boyunca XY pozisyonunu getirin) ve analiz gerektirir, ancak size basit rastgele seçmekten çok daha gerçek bir etki verir. Sebebin için buna değebilir.
Chris Cirefice

10

İşaretçiyi hareket ettirmeye çalışmak yerine uygulamayı (web sayfası) taşıyabilirsiniz. İçinde bazı giriş alanları olan basit bir html formu yazdım. Fareyi forma götürdüğünüzde, form taşınır.

Görebilirsiniz jsfiddle hareket formun bir demo . Efekti görmek için giriş alanlarından birini tıklamaya çalışın.

Bunu başarmak için jquery sallama efektini kullandım. Sarsıntı efekti için javascript şöyle görünür ve fare üzerinde her hareket ettiğinde formun yukarı ve aşağı hareket etmesine neden olur:

<script type="text/javascript">
    $(document).ready(function() {
        $("#toggle").hover(function () {
            $(this).effect("shake", { direction: "up", times: 1, distance: 40}, 1000);
        });
    });
</script>

Form sadece yukarı ve aşağı hareket etse de, istenen etkiye sahip olduğunu düşünüyorum. Form hareketini değiştirmek için parametrelerle (yön, zaman, mesafe ve yukarıda adı geçen "1000") oynayabilirsiniz.


3
Bunu kendim de düşündüm, ancak uygulanması daha kolay olsa da, bir titremenin "gerçek" deneyimini göstermiyor.
Joshua Muheim

10

Neden bir donanım çözümü kullanmıyorsunuz? Logitech G500 gibi ağırlıkları koyabileceğiniz bazı fareler var. Bir ağırlık koymak yerine, fareyi hafifçe sallayan küçük bir salınımlı motor yerleştirin. Bu aynı zamanda gerçek bozukluğu daha fazla simüle etti: sadece titreyen imleç değil, tüm el ve fare. Ayrıca, web sitelerinden başka yazılımlar da gösterebileceğiniz anlamına gelir.

Ağırlık yuvası olan bir fare yerine, fareye bir şey de yapıştırabilirsiniz, ancak bu daha belirgindir.


Mekanik bir bilgisayar değil de bilgisayar meraklısı olduğum için elektronik bir çözüme bağlı kalacağım. Teşekkürler!
Joshua Muheim

Olası bir donanım çözümü, (muhtemelen kablolu) fareye rastgele bir gürültü üreteci ekleyerek bugger'i oluşturmaktır.
Hot Licks

6

Özel bir fare sürücüsü ile yapmayı düşündüğünüzde, PC'de çalışan küçük bir programın her ikisini de yapacağını varsayalım? Bu durumda, imleci geçerli imleç konumu etrafında artı eksi 5 piksel aralık ile rastgele hareket ettiren C # için küçük bir snippet. Her yer değiştirmeden sonra program 50 ms ila 100 ms bekler (doğru değil!). Titreme, yer değiştirme ve duraklamalar için değerlerin uyarlanmasıyla yapılandırılabilir. Bunu bir konsol uygulamasında çalıştırdım ve - değerlere bağlı olarak - programı durdurmam oldukça zor oldu.

Random rand = new Random();

while(true)
{
    Cursor.Position = new Point() { X = Cursor.Position.X + rand.Next(11)-5, Y = Cursor.Position.Y + rand.Next(11)-5 };
    Thread.Sleep(rand.Next(50) + 50);
}

6

İşte AutoIt kullanan xdotool betiğimin bir Windows sürümü . Bu benim ilk AutoIt betiğimdi ve yazmak sadece birkaç dakika sürdü, bu yüzden geliştirilebileceğinden eminim. Sadece .au3 uzantısıyla kaydedin ve AutoIt (Run Script x86) ile çalıştırın.

HotKeySet("{HOME}", "GStart")
HotKeySet("{PAUSE}", "Gpause")
HotKeySet("{ESC}", "Gexit")

While 1
    Sleep(100)
WEnd

Func Gstart()
While 1
    sleep(100)
    $pos = MouseGetPos()
    $x = $pos[0] + 10 - Random(0, 20, 1)
    $y = $pos[1] + 10 - Random(0, 20, 1)
    MouseMove($x,$y)
Wend
Endfunc


Func Gpause()
While 1
   sleep(100)
Wend
Endfunc

Func Gexit()
    MsgBox(0, "exit box", "Script exited")
    Exit 0
EndFunc

Kontroller

  • Ana Sayfa: Simülasyonu başlat.
  • duraklat: Simülasyonu duraklat.
  • Esc: Simülasyondan çık.

Ya da derlediğim versiyonu buradan kullanın .


Çok hoş. Teşekkür ederim!
Joshua Muheim

5

Kimsenin ellerini mükemmel bir şekilde sabit tutacağını bekleyemezsiniz, bu yüzden düşünebileceğiniz bir şey,

  1. Kullanıcılara ne yaptığınızı ve
  2. Demo sayfasındaki tıklanabilir öğeleri normalden çok daha küçük yapın.
  3. Örnek sistemdeki fare hassasiyetini maksimuma çıkarmak.

Akıl yürütmem (uyarı, ux veya tıp uzmanı değilim) tıklanabilir öğeleri küçülterek, Parkinson hastalığı olan bir kişinin günlük bir web sitesiyle karşılaşacağı çoğu insan için benzer bir sorun yaratırsınız.


Bu da ilginç bir fikir. Herhalde tıklanabilir öğeleri oldukça küçük yapmayı planlıyorum.
Joshua Muheim

2
Korkarım çoğu fare kullanıcısı, konsantre olurlarsa cihazlarını 1-2 piksele kadar kontrol edebilirler - örneğin, elin sallanması kullandığım fare ayarları ile 1 pikselin altında. Düğmeler 1-2 pikselden büyükse muhtemelen evrensel bir çözüm değildir ...
Jonas Heidelberg

Fare hızını çarpar ve ayarları maksimuma tıklatarak # 3 eklerim
Ryan B

Farede bir tür "otomatik ses kontrolü" olması anlamlı olurken, daha büyük hareketleri "normal" e yakınlaştırırken küçük hareketleri güçlendirir.
Hot Licks

4

Bu makalede anlatılan gibi yaşlılık simülasyonu kullanabilirsiniz ... El titremelerinin bir kısmının bileğin etrafına sarılmış titreşimli bir motor, ayrıca elleri genellikle sakar hale getirmek için bazı kalın eldivenler olduğundan şüpheleniyorum.


Teşekkür ederim. Bu çok ilginç olmasına rağmen, muhtemelen her ziyaretçiyi elbiseye koymak için para ve zamanımız olmayacak. ;)
Joshua Muheim

5
Bu yorum olarak daha uygun olmaz mıydı?
Selali Adobor

Javascript ve html etiketleri hakkında biraz kafam karıştı, ancak asker ayrıca özel fare sürücüleri (ve daha sonra bahsedilen tabletler) kullanmayı önerdiğinden, diğer çözümler açık gibi görünüyor. Belirli teknoloji sınırlamasını ortadan kaldırdığınızda, bu bir cevaptır. Gerçekten bu alandaki araştırmacıların yaşa bağlı engelliliği simüle etme sorununu çözme şekli budur. Ayrıca titremeleri istiyorsanız nispeten ucuz bir DIY yapabileceğinizi düşünüyorum - bu cırt cırt bilek ağırlıklarından ve titreşimli bir motordan biri, çok zor olmamalı.
user3067860

4
  • İçinde DIV, CSS kullanarak imleci gizlemecursor:none;
  • Bir .png İmleç görüntüsü oluşturun ve jQ açıkken ( left, top) taşıyınmousemove
  • .Png Rastgele margin-leftve margin-topbir kullanarak setTimeout (yeniden konumlandırma düzgün kullanımı CSS3 yapmak transitionJQ ile veya yok.animate() ).

Not: Betik, elin farede olup olmadığını bilemez;)

function rand(min, max) {return Math.random() * (max - min) + min;}

var $cursor = $('div img');

$('div').mousemove(function(e) {  // Make .png follow the mouse coordinates
  $cursor.css({
    left: e.pageX,
    top:e.pageY
  });
}).hover(function(e){
  $cursor.toggle(); // Show .png cursor as we enter the DIV
});

(function tremor(){ // Add tremor to .png image
  $cursor.css({
      marginLeft: rand(-15,15), // arm tremor
      marginTop:  rand(-30,30)  // hand contractions
  });
  setTimeout(tremor, rand(50,100));
}());
div{
  position:absolute;
  background:#eee;
  height:100%;
  width:100%;
  cursor:none;
}

div img{
  display:none;
  position:absolute;
  transition: margin 0.2s;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div><img src="http://i.stack.imgur.com/KwMGA.png"></div>


2

Titremeyi simüle etmenin düşük seviyeli kısımları şimdiye kadar iyi cevaplanmıştır. Benzetmek için titreme türüne odaklanan bir şey ekleyeceğim:

Çoğu cevap X ve Y yönünde sabit bir maksimum basamak genişliği ile rastgele bir yolda hareket eden bir fare imleci uygular.

Bu, düğme gibi belirli bir alana vurmayı zorlaştıran kullanım durumu için yeterince iyi çalışmalıdır.

Parkinson hastalığından bir titremenin neden olduğu UI problemlerini simüle etmenin daha genel bir sorunu için, bu tür titremenin el hareketlerini gerçekte simüle etmek en azından ilginç olacaktır.
Rastgele yürüyüşün çok iyi bir yaklaşım olmayabileceğinden şüpheleniyorum .

Tabii ki titreme hareketinin gerçek el izi verilerini elde etmek zor olabilir , ancak kesinlikle bu tür titremeyi analiz etmekle ilgili makaleler var:

Kağıt Parkinson Hastalığı El Hareketi Parametrik Temsil nasıl olduğunu iyi arsa 3D el hareketi izleri için.
Kağıt ödeme duvarlıdır, ancak sağ üstteki kitap görüntüsünde "İçine Bak>" etiketli önizleme , el izi verilerinin farklı sunumlarının bazı ilginç grafiklerini gösterir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.