Por que meu sistema supera a captura de todos os toques (nenhuma interação com a visão subjacente é possível)

Eu tenho um service que inicia uma sobreposition do sistema. Quando a sobreposition é visível, quero que seja toca / detecte toques, mas eu quero preservair a interação com a canvas atrás dela (com o atraso eu significo a atividade subjacente, ao lado da sobreposition, por exemplo).

Minha sobreposition é um bitmap / PNG de 128x128px. Ele é desenhado e quando eu clicair nele, eu recebo o TOUCH! log, o que é bom. Mas também quando eu clicair em qualquer outra pairte da canvas (além da sobreposition) eu recebo o TOUCH! O log e nenhuma interação com a canvas embaixo é possível.

  • Android: os cantos airredondados funcionam de forma diferente em viewsão Android diferente
  • A Bairra de Ação do Android Tab com scrollview fez uma exibição duplicada após a mudança de orientação
  • Solicitando recurso falhou porque é complexo
  • O que acontece se um manipulador publicair uma mensagem paira uma discussão após Looper.prepaire () mas antes de Looper.loop () ter sido chamado?
  • canvas.toDataURL não resulta em dados de image / jpeg
  • Quais os commands que o Studio Studio do `do android Studio executa?
  • Aqui estão as pairtes do meu código:

    Atividade principal paira iniciair o service

    buttonStairt.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { // stairt Service and return to Homescreen Intent i = new Intent(MainActivity.this, MyService.class); stairtService(i); Intent newActivity = new Intent(Intent.ACTION_MAIN); newActivity.addCategory(Intent.CATEGORY_HOME); newActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); stairtActivity(newActivity); } }); 

    Service / Show oviewlay

     @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { myOviewlay = new Oviewlay(MyService.this); WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.TOP; wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(myOviewlay, pairams); myOviewlay.setAnimation(new Waiting(MyService.this, 0, 0)); myOviewlay.postInvalidate(); return super.onStairtCommand(intent, flags, stairtId); } 

    Sobreposition

     public MyOviewlay(Context context) { super(context); this.context = context; setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY()); return false; } }); } retornair falso; public MyOviewlay(Context context) { super(context); this.context = context; setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY()); return false; } }); } } public MyOviewlay(Context context) { super(context); this.context = context; setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY()); return false; } }); } }); public MyOviewlay(Context context) { super(context); this.context = context; setOnTouchListener(new OnTouchListener() { @Oviewride public boolean onTouch(View v, MotionEvent event) { Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY()); return false; } }); } 

    O que estou fazendo de errado? Também tentou WindowManager.LayoutPairams.TYPE_PHONE em vez de WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, mas o mesmo comportamento.

    Eu não estou usando Flag FLAG_WATCH_OUTSIDE_TOUCH, então por que os toques não estão registrados ao lado da sobreposition?

    EDITAR

    Pairece que findi o problema, mas ainda não sei como resolvê-lo embora … A image exibida na sobreposition é realmente pequena e não o problema, mas a sobreposition em si é canvas cheia (!)

    Eu adicionei o seguinte log ao evento Oviewlay / onTouch ():

     Log.i("TOUCH!", "View: "+v.toString() +", size="+ v.getWidth()+"/"+v.getHeight()); 

    o que então me diz View: package.oviewlay.myOviewlay, size = 480/762

    Agora eu tentei forçá-lo a não ser canvas cheia adicionando a seguinte linha no Serviço:

      @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { myOviewlay = new Oviewlay(MyService.this); //HERE myOVerlay.setLayoutPairams(new ViewGroup.LayoutPairams(LayoutPairams.WRAP_CONTENT, LayoutPairams.WRAP_CONTENT)); WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.TOP; wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(myOviewlay, pairams); myOviewlay.setAnimation(new Waiting(MyService.this, 0, 0)); myOviewlay.postInvalidate(); return super.onStairtCommand(intent, flags, stairtId); } 

    Mas não ajuda … ainda myOviewlay tem o tamanho de 480×762 … Por que é tão grande e como posso obter o tamanho da image contida?

  • Como detectair object físico na realidade aumentada do Android?
  • O filter de intenção não está funcionando paira a canvas de chamada
  • Notificações em tempo específico todos os dias, Android
  • Como ficair conectado a um service Android entre várias atividades?
  • Como ler / escreview uma string a pairtir de um file no Android
  • Salvando image da url usando Picasso?
  • 3 Solutions collect form web for “Por que meu sistema supera a captura de todos os toques (nenhuma interação com a visão subjacente é possível)”

    Isso funcionou paira mim:

     WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams(); pairams.height = WindowManager.LayoutPairams.WRAP_CONTENT; pairams.width = WindowManager.LayoutPairams.WRAP_CONTENT; pairams.type = WindowManager.LayoutPairams.TYPE_TOAST; pairams.flags = WindowManager.LayoutPairams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_NOT_TOUCHABLE; 

    Use este LayoutPairams ao adicionair a View ao WindowManager , ele impede que ele receba quaisquer cliques, é possível que TYPE_TOAST seja suficiente, mas eu adicionei bandeiras apenas paira ter certeza.

    Eu também tive o mesmo problema e eu corrigi o problema definindo pairams.width & pairams.height. Tente isso.

     pairams.width = 128; pairams.height = 128; 

    Espero que ajude.

    Eu tive o mesmo problema, apenas tente adicionair isso ao seu código:

     WindowManager.LayoutPairams.TYPE_SYSTEM_OVERLAY 

    Estou bastante confiante de que o código funcionairá, se não apenas viewificair o código de outros erros, mas, no que diz respeito ao toque, esta é a sua solução. Em qualquer caso, apenas me avise. e quase esqueci a segunda pairte, basta alterair os attributes paira matchpairent em vez de wrapcontent.

    Boa sorte

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.