2014-09-18 36 views
2

我目前正在潛入Android開發中,最近遇到了困難。我想創建一個覆蓋應用程序,它位於所有其他應用程序之上。它應該監聽三指輕掃,而所有其他觸摸事件應該由操作系統(例如,底層應用程序)處理。僅對某些觸摸事件起作用的疊加應用程序

這可能嗎?

我已經發現我需要添加LayoutParam TYPE_PHONE而不是SYSTEM_ALERT,因爲後者會消耗所有的觸摸事件。 所以我的課,現在看起來是這樣的:

package [...] 

public class Overlay extends Service { 

    private TView mView; 
    private ThreeFingerSwipeDetector detector = new ThreeFingerSwipeDetector() { 

     @Override 
     public void onThreeFingerTap() { 
      Toast.makeText(getBaseContext(), "Three Fingers recognized.", Toast.LENGTH_SHORT).show(); 
     } 
    }; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(getBaseContext(), "Launched! :-)", Toast.LENGTH_SHORT).show(); 

     mView = new TView(this); 
     WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.WRAP_CONTENT, 
       // PHONE, because SYSTEM_ALERT will consume _ALL_ touch events 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH 
         | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 
         | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
     params.gravity = Gravity.RIGHT | Gravity.TOP; 
     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.addView(mView, params); 
    } 



    @Override 
    public void onDestroy() { 
     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.removeView(mView); 
     mView = null; 
     super.onDestroy(); 
    } 





    // inner class 
    class TView extends ViewGroup { 

     public TView(Context context) { 
      super(context); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      super.onDraw(canvas); 
     } 

     @Override 
     protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { 
     } 



     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      if(detector.onTouchEvent(event)) { 
       return true; 
      } 

      //TODO: what am I supposed to do when it's not a 3 finger swipe (aka the detector doesn't recognize it as one) 
// something like super.onInterceptTouchEvent(event) or so? 
      } 
    } 
    } 

探測器會正確地檢測三指輕掃,但我在當前狀態下的應用程序將阻止潛在的UI所有其他用戶交互,直到我殺的應用程序。

是否有任何系統調用可以使用MotionEvent作爲參數在我的TODO註釋中調用?或者我想要一些不可能的東西?

非常感謝,非常感謝!

編輯: 的ThreeFingerSwipeDetector類看起來是這樣的:

[Import, ...]  
public abstract class ThreeFingerSwipeDetector { 


    public boolean onTouchEvent(MotionEvent event) { 
     int t = event.getActionMasked(); 
     switch(event.getActionMasked()) { 
     case MotionEvent.ACTION_POINTER_DOWN: 
      if(event.getPointerCount() == 3) 
       onThreeFingerTap(); 
       return true; 
     case MotionEvent.ACTION_DOWN: 
      if(event.getPointerCount() == 3) { 
       onThreeFingerTap(); 
       return true; 
     }    
     } 

     return false; 
    } 

    public abstract void onThreeFingerTap(); 
} 

其實它不是一個刷卡識別但但只檢查三個手指輕敲現在。無論如何,那裏的邏輯應該是完全一樣的。

+0

'ThreeFingerSwipeDetector'究竟做什麼,代碼明智? 'detector.onTouchEvent(event)'目前是否返回'false'?我想它可能不會,這可以解釋爲什麼任何和所有的觸摸事件都被使用,直到你殺死你的應用程序。或者,您可能想通過重寫'onInterceptTouchEvent()'而不是'onTouchEvent()'來決定是否通過觸摸事件做某件事。 – 2014-09-19 09:07:27

+0

所以我在原來的文章中加入了'ThreeFingerSwipeDetector'。它不能識別一個滑動,但還是三個手指敲擊,但現在不應該改變任何東西。我也調試了它,當我用少於3個手指觸摸屏幕時,它實際上返回了錯誤。當我覆蓋'onInterceptTouchEvent(Event event)'時,根本沒有任何事情發生,因爲看起來這個方法只被調用一次而不是'onTouchEvent(Event event)',它被頻繁地調用。 – visi0nary 2014-09-19 15:22:37

回答

0

我會回答我自己的問題:這根本不可能。根據THIS文章和Android文檔,您可以使用自版本4.0.3以來的所有觸摸事件或無。所以不可能只處理一些觸摸事件並讓其他人通過覆蓋。

相關問題