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?

InformationsquelleAutor Toni Kanoni | 2013-03-06
Schreibe einen Kommentar