我目前正在潛入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();
}
其實它不是一個刷卡識別但但只檢查三個手指輕敲現在。無論如何,那裏的邏輯應該是完全一樣的。
'ThreeFingerSwipeDetector'究竟做什麼,代碼明智? 'detector.onTouchEvent(event)'目前是否返回'false'?我想它可能不會,這可以解釋爲什麼任何和所有的觸摸事件都被使用,直到你殺死你的應用程序。或者,您可能想通過重寫'onInterceptTouchEvent()'而不是'onTouchEvent()'來決定是否通過觸摸事件做某件事。 – 2014-09-19 09:07:27
所以我在原來的文章中加入了'ThreeFingerSwipeDetector'。它不能識別一個滑動,但還是三個手指敲擊,但現在不應該改變任何東西。我也調試了它,當我用少於3個手指觸摸屏幕時,它實際上返回了錯誤。當我覆蓋'onInterceptTouchEvent(Event event)'時,根本沒有任何事情發生,因爲看起來這個方法只被調用一次而不是'onTouchEvent(Event event)',它被頻繁地調用。 – visi0nary 2014-09-19 15:22:37