3

Androidのすべてのアプリケーションの上で常に実行されるビューインサービスを作成しました。

サービスの初期動作は TYPE_SYSTEM_ALERT です。

WindowManager.LayoutParams layparams = new WindowManager.LayoutParams(
 WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT, 
 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
 WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
 PixelFormat.TRANSLUCENT);
 layparams .gravity = Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL;
 wm = (WindowManager) getSystemService(WINDOW_SERVICE);
 wm.addView(serviceView, layparams );

実行時にサービスの動作を変更するということは、タッチ時に TYPE_SYSTEM_ALERT と TYPE_SYSTEM_OVERLAY を切り替えることを意味します。ビュー パラメータの外側をタッチすると、ビュー パラメータの内側をタッチすると、切り替えが行われます。

layparams .type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
Using updateViewLayout(serviceView, layparams )

問題:ビューの外側に触れると、最初のタッチで TYPE_SYSTEM_OVERLAY がアクティブになり、その後アプリの外側が正常に動作します。TYPE_SYSTEM_OVERLAY が機能している場合、その後ビュー内をタッチすると、ビューのアクションではなく、ビューの背後にあるオブジェクトのアクションがトリガーされます。しかし、一度ビューに触れると TYPE_SYSTEM_ALERT が適用され、ビューは正常に動作するようになります。

現在の実装: レイアウト パラメーター間で切り替えが行われたときに、その特定の処理を行うには 2 回タッチする必要があります。

4

2 に答える 2

5

これを使用してください... ICS以上で完全に動作します

params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;//This one is necessary.
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
params.gravity = Gravity.TOP | Gravity.RIGHT;
params.x = 0;
params.y = -params.height;
windowManager.addView(tile, params);
于 2014-09-03T09:54:40.993 に答える
0

クラスupdateViewLayout()のインスタンスを呼び出すことでこれを行うことができます。WindowManager

 wm = (WindowManager) getSystemService(WINDOW_SERVICE);

 // create new layout params
 WindowManager.LayoutParams newlayparams = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
      PixelFormat.TRANSLUCENT);

 //update new layout
 wm.updateViewLayout(serviceView, newlayparams);

それが役立つことを願っています!

于 2012-11-10T17:27:39.077 に答える