2012-03-15 3 views
2

Я создал TYPE_SYSTEM_OVERLAY, и я хочу захватить события пальца/касания на этом оверлее, используя service.GestureDetector в TYPE_SYSTEM_OVERLAY

Оверлей прекрасно работает, но проблема в том, что он не может захватить события касания, когда я пытаюсь включить в него GestureDetector. Когда я нажимаю на экране, тост сбщ «onDown» не показал ..

будет признателен, если кто-нибудь скажет мне, где есть я не заладилось :(Я попытался реализовать GestureDetector за пределами OverlayView класса, но и никакого результата.

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; 
     } 
} 

ответ

2

Во-первых, это не должно быть IntentService. В текущей реализации, onDestroy() будет называться миллисекунды или два после onCreate().

Во-вторых, TYPE_SYSTEM_OVERLAY не может принимать какие-либо события прикосновения от Android 4.0, для обеспечения безопасности причина s.

+0

привет благодарю за ответ. но если я поставил toast msg на 'onTouchEvent', это сработает. Также важно ли использовать« IntentService »? Я реализую на Android 2.2, так что должно быть хорошо? – star

+0

@star: «так важно, если я использую IntentService?» - Конечно, это важно. Вы удаляете свой вид сразу после его добавления. – CommonsWare

+0

У меня есть GestureDetector, используя 'Сервис', но также не могу работать [i cant @Override onTouchEvent()? Тот же код работает с использованием 'Activity'. Любая идея, как я могу использовать GestureDetector с помощью службы? – star

Смежные вопросы