2012-01-31 11 views
18

Zasadniczo próbuję uzyskać wszystkie dane zdarzeń dotykowych z czegoś w rodzaju nakładki systemowej, przenieść moje obiekty na podstawie danych dotykowych, a następnie pozwolić systemowi/ekranowi głównemu/przeglądarce działać zgodnie z danymi (lub na odwrót)). Znalazłem podobne pytania, ale nic, co by mnie prowadzi nigdzie nie mam już:Nakładka Android, aby pobrać WSZYSTKIE dotknięcie i przekazać je dalej?

Getting the View that is receiving all the touch events

(realizowane z wynikami poniżej) Creating a system overlay window (always on top)

Co mogę zrobić:

Mogę ZABIĆ WSZYSTKIE zdarzenia dotykowe i działać na nich, przenosząc moje duszki i nie pozwalając OS/ekranowi głównemu/przeglądarce na ich wyświetlanie, LUB ELSE Mogę pozwolić, aby zdarzenia dotykowe przeszły i otrzymały tylko "TOUCH_OUTSID" E ", aby moja aplikacja mogła działać.

Moja unattained cel:

nie mogę dla życia mnie znaleźć sposób wokół staje się zarówno do pracy z danymi. Jedyne metody, jakie mogę wymyślić, których nie mogę wdrożyć to: Przechwytywanie danych w mojej aplikacji i przekazywanie ich na OS/homescreen/przeglądarkę do pracy z Umożliwianie OS/homescreenowi/przeglądarce dostępu do danych w pierwszej kolejności, a następnie uzyskanie wywołania zwrotnego z informacjami w pewien sposób Pozwalając systemowi/ekranowi głównemu/przeglądarce na pobieranie danych, działanie na danych i odpytywanie ich pod kątem ich wartości przewijania/lokalizacji w celu działania w mojej aplikacji.

Obawiam się, że to po prostu nie jest to możliwe, myślę, że czytałem gdzieś w jakiejś dokumentacji, że nie mogę znaleźć teraz: „To wszystko albo nic, albo twój widok dostaje wszystkie zdarzenia, albo żaden z nich”

(Aby uniknąć nieporozumień, nie mam na myśli mam dwa widoki. To znaczy mam jeden widok sterowany poprzez działalności/usługi nakładania OS/ekranu głównego/przeglądarki. Niczym szybę, jeśli będzie.)

Dziękuję za wszelkie pomocne informacje, które możesz zaoferować, jest to bardzo cenne!

[AKTUALIZACJA] Opublikowałem własną dokumentację dotyczącą poniższej kwestii, aby nie wprowadzać w błąd.

+0

wykorzenia opcję i czy starasz się, aby to działało tylko dla jednego urządzenia lub urządzenia ogólnego? Mam rozwiązanie, które polega na rootowaniu telefonu i monitoringu/dev/input/eventX, gdzie X jest strumieniem zdarzeń dostarczającym informacji o zdarzeniu dotyku. Działa to jednak tylko wtedy, gdy urządzenie jest zrootowane i musi być dostosowywane indywidualnie dla każdego urządzenia. –

Odpowiedz

10

Znaleziony tę dokumentację, że dość dużo stwierdza, że ​​nie jest to możliwe do zrobienia zarówno: Android : Multi touch and TYPE_SYSTEM_OVERLAY

Dyskutują obejścia, ale nie sądzę, każdy z nich będzie faktycznie pracują na dokładnie to, co ja” Próbuję to zrobić. Obaj podali wydarzenia do aplikacji bazowej i byli w stanie ich podsłuchiwać, aby zająć się nimi osobiście.

Aby utworzyć widok nakładki, podczas konfigurowania LayoutParams trzeba ustawić typ do TYPE_SYSTEM_OVERLAY i użyć flagi FLAG_WATCH_OUTSIDE_TOUCH.Stanowi to problem, ponieważ zgodnie z dokumentacją systemu Android w wersji : "nie otrzymasz pełnego gestu w dół/w ruchu/w górę , a tylko lokalizacja pierwszego zstępującego jako ACTION_OUTSIDE." Aby otrzymać pełen zestaw zdarzeń dotykowych , należy użyć typu TYPE_SYSTEM_ALERT, ale powoduje to, że nakładka przejmuje kontrolę nad ekranem i zatrzymuje interakcję z innymi elementami .

ktoś chce zgodzić Chciałbym usłyszeć dobre wieści :-D

+0

Prosimy o sprawdzenie linijki pikseli z sklepu Play, który odbiera tylko te wydarzenia, które chce .. https: //play.google.com/store/apps/details? Id = net.skoumal .pixelruler.trial & hl = en –

+0

Ale naprawdę nie mam pojęcia, jak to zrobili –

2

Możesz użyć GestureOverlayView, jeśli chcesz ukryć linie, które rysuje możesz ustawić kolor na Transparent # 00000000, aby się nie pojawił, a następnie możesz uchwycić wszystkie dotknięcia i gesty.

http://developer.android.com/resources/articles/gestures.html

+0

nie jest rozwiązaniem. Gdybym budował mój launcher lub aplikację domową, to tak. To jednak nie daje mi więcej widoczności/przechwycenia w odniesieniu do zdarzeń dotykowych. –

+0

Jak myślisz? Możesz dziedziczyć z tej kontroli i przechwytywać zdarzenia dotykowe i radzić sobie z nimi z dużą aktywnością, pomimo twojego układu ... – emalamisura

+0

Myślę, że próbowałem tego. W moim pytaniu mówię, że nakładam infront systemu operacyjnego/przeglądarki/Launchera ... wszystko. To po prostu daje mi możliwość bycia leniwym i nieskrępowania moich własnych gestów i gestów? Wciąż zdarzenie pojedynczego dotknięcia (ZEWNĄTRZ) jest uruchamiane, gdy przewijam ekran główny/przeglądarkę ... Przepraszam, jeśli pomyliłem Cię w pytaniu. –

0

To nie jest optymalnym rozwiązaniem, ale to działa. Zrestartuj usługę przełączania flagi, której nie można dotknąć. dodaj wartość boolean do opcji Intent, która służy do uruchamiania usługi w celu określenia poprzedniej wartości przełączania stanu. Lepszą realizacją byłoby wystrzelenie zamiaru dotyku, gdy okno nasłuchuje i po ustalonym czasie, kiedy nie słucha.

public class bleh extends Service { 
public void onCteqwer(int i) { 

Context context; Class <bleh> context1 = bleh.class; 

WindowManager.LayoutParams params = null; 
WindowManager mang = (WindowManager) getSystemService(WINDOW_SERVICE); 

//check previous state of service 
if(i==0) 
params = new WindowManager.LayoutParams(arg0,arg1,arg2,arg3,arg4,arg5); 

if(i==1) 
    params = new WindowManager.LayoutParams 
(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,arg0,arg1,arg2,arg3,arg4); 

LayoutInflater inflater = (LayoutInflater) getSystemService 
(LAYOUT_INFLATER_SERVICE); 
View mViw = inflater.inflate(arg, null); 

mViw.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) {  
      return true;   
} 
    }); 

mang.addView(mViw, params); 
Intent z = new Intent(context, context1); 
if(i==0) 
z.putExtra("name", 1); 
if(i==1) 
z.putExtra("name", 0); 
stopSelf(); 
startService(z); 

} 

@Override 
public IBinder onBind(Intent arg0) { 
return null; 
} 
@Override 
public void onStart(Intent intent, int startId) { 
super.onStart(intent, startId); 
Bundle i=intent.getExtras(); 
int userName = 0; 

if (i != null) 
{ 
userName = i.getInt("name"); 
onCteqwer(userName); 
} 
} 
0

Szukałem tego samego.

Flaga ta wystarcza dla mnie FLAG_NOT_TOUCH_MODAL

działa na Androidzie 7 i 8 konfiguracji jak poniżej.

Jedyne działanie, jakie dotychczas wdrożyłem, to dotyk, by zamknąć okno nakładki.

Użyłem także kodu z tej strony, Example System Overlay Code on Github, który był potrzebny do uzyskania zdarzeń.

Przy okazji Google Maps wykonuje naprawdę dobrą robotę dzięki temu na Androidzie 8. Możesz przeciągnąć okno nakładki, zmienić jej rozmiar lub zamknąć. Wszystkie inne aplikacje działają dobrze, gdy jest już gotowa.

var type = 0 

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) 
    { 
     type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 
    } 
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
    { 
     type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY 
    } 

    var flags = FLAG_NOT_TOUCH_MODAL 

    mOverlayLayoutParams = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, type, flags, PixelFormat.TRANSLUCENT) 
Powiązane problemy