2012-03-15 3 views
2

J'ai créé un TYPE_SYSTEM_OVERLAY et je souhaite capturer des événements tactiles/tactiles sur cette superposition en utilisant un service.GestureDetector dans un TYPE_SYSTEM_OVERLAY

La superposition fonctionne correctement, mais le problème est qu'elle ne peut pas capturer les événements tactiles lorsque j'essaie d'y incorporer le GestureDetector. Quand je tape sur l'écran, le pain grillé msg « onDown » na pas .. show

apprécieront si quelqu'un me dit où je suis allé ai mal :(J'ai essayé de mettre en œuvre la GestureDetector en dehors de la classe OverlayView mais aussi aucun résultat.

public class NUSLogService extends IntentService { 
     OverlayView mView; 

     @Override 
     public void onCreate() { 
      super.onCreate(); 

      final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
       WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
       PixelFormat.TRANSLUCENT); 

       params.gravity = Gravity.RIGHT | Gravity.BOTTOM; 
       params.setTitle("TouchLayer"); 
       mView = new OverlayView(getApplicationContext()); 

      final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
       wm.addView(mView, params); 
     } 
    @Override 
    public void onDestroy() { 
      super.onDestroy(); 
      if(mView != null) 
      { 
      ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView); 
      mView = null; 
      } 
     } 

    //self-created overlay class 
    class OverlayView extends ViewGroup implements OnGestureListener{ 

     private GestureDetector gestureScanner = new GestureDetector(this); 

     public OverlayView(Context context) { 
     super(context); 
     Toast.makeText(getContext(),"OverlayView", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
    //  return super.onTouchEvent(event); 
      return gestureScanner.onTouchEvent(event); 
     } 

     @Override 
     protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { 
     // TODO Auto-generated method stub   
     } 

     @Override 
     public boolean onDown(MotionEvent e) { 
     Toast.makeText(getContext(),"onDown", Toast.LENGTH_SHORT).show(); 
     return false; 
     } 
} 

Répondre

2

En premier lieu, cela ne devrait pas être un IntentService. Dans votre implémentation actuelle, onDestroy() sera appelé un millième de seconde ou deux après onCreate().

Deuxièmement, TYPE_SYSTEM_OVERLAY ne peut recevoir aucun événement tactile comme d'Android 4.0, pour la sécurité raison s.

+0

Salut merci pour la réponse. mais si je mets toast msg sur 'onTouchEvent', ça marche ... est-ce important si j'utilise' IntentService'? Je suis l'implémentation sur Android 2.2, donc ça devrait aller pour le moment? – star

+0

@star: "Est-ce important si j'utilise IntentService?" - Bien sûr, c'est important. Vous supprimez votre vue immédiatement après l'avoir ajoutée. – CommonsWare

+0

J'ai implémenté le GestureDetector en utilisant 'Service' mais je ne peux pas non plus travailler [i cant @Override the onTouchEvent()? Le même code fonctionne en utilisant 'Activity'. Toute idée comment je peux utiliser le GestureDetector en utilisant le Service? – star

Questions connexes