Warum ist mein system overlay fangen alle Noten (keine Interaktion mit der zugrunde liegenden Ansicht ist möglich)
Habe ich einen Dienst startet einen system-overlay. Wann das overlay sichtbar ist, ich will es Anfassen/erkennen Berührungen, aber ich bewahren wollen, die die Interaktion mit dem Bildschirm dahinter (mit hinten meine ich die zugrunde liegende Tätigkeit, neben der überlagerung zum Beispiel).
Mein overlay ist ein bitmap/PNG von 128x128px. Es wird gezeichnet und wenn ich es auf, erhalte ich die TOUCH! melden Sie, das ist gut.
Aber auch wenn ich auf einem anderen Teil des Bildschirms (neben der overlay) bekomme ich die TOUCH! log und keine Interaktion mit dem Bildschirm unter ist es möglich.
Hier sind die Teile von meinem code:
Haupt-Aktivität um den Dienst zu starten
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//start Service and return to Homescreen
Intent i = new Intent(MainActivity.this, MyService.class);
startService(i);
Intent newActivity = new Intent(Intent.ACTION_MAIN);
newActivity.addCategory(Intent.CATEGORY_HOME);
newActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newActivity);
}
});
Service/Show overlay
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
myOverlay = new Overlay(MyService.this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.TOP;
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(myOverlay, params);
myOverlay.setAnimation(new Waiting(MyService.this, 0, 0));
myOverlay.postInvalidate();
return super.onStartCommand(intent, flags, startId);
}
Overlay
public MyOverlay(Context context) {
super(context);
this.context = context;
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY());
return false;
}
});
}
Was mache ich falsch? Habe auch versucht WindowManager.LayoutParams.TYPE_PHONE statt WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, aber das selbe Verhalten.
Ich bin nicht mit der Fahne FLAG_WATCH_OUTSIDE_TOUCH, also warum sind die Berührungen nicht registriert neben dem overlay?
BEARBEITEN
Es scheint, ich habe das problem gefunden, aber noch nicht wissen, wie es zu lösen, obwohl...
Die angezeigten Bildes in das overlay ist wirklich klein und auch nicht das problem, aber das overlay an sich ist Vollbild (!)
Habe ich noch folgende log-Overlay /onTouch () - Ereignis:
Log.i("TOUCH!", "View: "+v.toString() +", size="+ v.getWidth()+"/"+v.getHeight());
die erzählt mir dann Anzeigen: Paket.overlay.myOverlay, size=480/762
Nun versuchte ich, zu zwingen, es nicht zu sein, Vollbildmodus, indem Sie die folgende Zeile in den Dienst:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
myOverlay = new Overlay(MyService.this);
//HERE
myOVerlay.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.TOP;
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(myOverlay, params);
myOverlay.setAnimation(new Waiting(MyService.this, 0, 0));
myOverlay.postInvalidate();
return super.onStartCommand(intent, flags, startId);
}
Aber es hilft nicht... noch myOverlay hat die Größe von 480x762... Warum ist es, dass große und wie bekomme ich es auf die Größe des enthaltenen Bildes?
- Wie groß ist Ihre Auflage? Nicht behandelt werden der gesamte zugrunde liegende layout? Ist es eine transparente Sache?
- "aber ich will zu bewahren, die die Interaktion mit dem Bildschirm dahinter" -- glücklicherweise ist dies nicht länger möglich als auf Android 4.0.3, um zu verhindern, dass tapjacking Angriffe, mindestens für berührt auf die Bedeckung selbst. Ein overlay erhalten Sie entweder touch-Ereignisse (und die sind nicht weitergeleitet entlang) oder nicht erhalten touch-Ereignisse (wie ein
Toast
). - Seine ein 128x128 px bitmap gezeichnet auf einer Leinwand. Es hat einen transparenten hintergrund, ja, das heißt, ich sollte wahrscheinlich machen es undurchsichtig um zu testen, ob Ihr wirklich so kleine... ich werde versuchen das herauszufinden
- Vielleicht wurde die Interaktion das falsche Wort. Ich dont wollen zu interagieren, ich möchte nur zu Holen, klickt auf das overlay, während zum Beispiel das drücken der Nachrichten-Symbol auf dem homescreen immer noch öffnet sich die Nachrichten app. Im ziemlich sicher, ich habe gesehen, dies geschieht durch eine andere app auf meinem Gerät (ICS)
- "Ich will nur zu Holen, klickt auf das overlay, während zum Beispiel das drücken der Nachrichten-Symbol auf dem homescreen immer noch öffnet die Nachrichten-app" - wenn das "Nachrichten-Symbol" hinter dem overlay, das sollte nicht mehr Arbeit, als von Android 4.0.3.
- Mit hinter, du meinst direkt hinter (=überlappung), richtig? Wenn dem so ist, dann ist das ok, aber ich habe ein kleines overlay am oberen Rand des Bildschirms und kann immer noch nicht beginnen, alles, sogar auf den unteren Bereich des Startbildschirms. Also, vielleicht ist mein overlay ist größer als ich denke und ich habe nicht sehen, weil Sie die Transparenz?? Ich werde berichten
- Ich habe den Fehler gefunden aber weiß nicht wie es zu lösen: Das overlay im Vollbildmodus ist (siehe meine ursprüngliche Frage, die ich bearbeitet). Können Sie mir helfen, dass?
- Haben Sie Feste das jetzt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser arbeitete für mich:
Verwenden Sie diese LayoutParams, wenn Sie den
View
zu denWindowManager
, es verhindert, dass erhalten, keine Klicks, ist es möglich, dassTYPE_TOAST
ist ausreichend, aber ich habe Hinzugefügt-Flaggen, nur um sicherzugehen.LayoutParams.TYPE_TOAST
ist veraltet für Android-Oparams.format = PixelFormat.TRANSLUCENT;
kann auch hilfreich seinIch hatte auch das gleiche problem, und ich das problem beheben, indem Sie set params.Breite & params.Höhe.
Dies versuchen.
Ich hoffe, es wird helfen.
Ich hatte das gleiche problem, versuchen Sie einfach zu fügen Sie diese zu Ihrem code:
Ich bin mir ziemlich sicher, dass der code funktioniert, wenn nicht, einfach mal den code für einige andere Fehler, aber so weit wie die Berührung betrifft, ist dies Ihre Lösung. In jedem Fall lass es mich wissen. und hätte ich fast vergessen den zweiten Teil, ändern Sie einfach die Attribute matchparent statt wrapcontent.
Glück
TYPE_SYSTEM_OVERLAY
windows nicht empfangen kann touch events.