[解決済み】システムオーバーレイウィンドウの作成(常に一番上に表示)
2022-04-16 10:03:36
質問
常に一番上に表示されるボタン/クリック可能な画像を作成しようとしています。 すべてのウィンドウの一番上に常に表示されます。
実証 コンセプトは
成功し、現在サービスが稼働しています。このサービス 画面左上に常にテキストが表示され、その一方で は、通常の方法で他のアプリを自由に操作することができます。
私がやっていることは
のサブクラスです。
ViewGroup
でルートウィンドウマネージャに追加し
フラグ
TYPE_SYSTEM_OVERLAY
. 今度は、ボタン/クリック可能な画像
は、このテキストの代わりにタッチイベントを受け取ることができます。I
をオーバーライドしてみました。
ViewGroup
しかし
はイベントを受信しない。
特定の部分だけイベントを受信するには を使用することができますか?ご教示ください。
public class HUD extends Service {
HUDView mView;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
mView = new HUDView(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
0,
// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
params.setTitle("Load Average");
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_LONG).show();
if(mView != null)
{
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView);
mView = null;
}
}
}
class HUDView extends ViewGroup {
private Paint mLoadPaint;
public HUDView(Context context) {
super(context);
Toast.makeText(getContext(),"HUDView", Toast.LENGTH_LONG).show();
mLoadPaint = new Paint();
mLoadPaint.setAntiAlias(true);
mLoadPaint.setTextSize(10);
mLoadPaint.setARGB(255, 255, 0, 0);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("Hello World", 5, 15, mLoadPaint);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//return super.onTouchEvent(event);
Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
return true;
}
}
解決方法は?
これは愚かな解決策かもしれません。でも、うまくいくんです。もし、改善できるのであれば、教えてください。
サービスのOnCreate。私は
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
フラグを使用します。サービスの変更点はこれだけです。
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
mView = new HUDView(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
params.setTitle("Load Average");
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
}
これで、クリックするたびにイベントが発生するようになります。そこで、イベントハンドラで修正する必要があります。
ViewGroupのタッチイベントで
@Override
public boolean onTouchEvent(MotionEvent event) {
// ATTENTION: GET THE X,Y OF EVENT FROM THE PARAMETER
// THEN CHECK IF THAT IS INSIDE YOUR DESIRED AREA
Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
return true;
}
また、このパーミッションをマニフェストに追加する必要がある場合もあります。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
関連
-
[解決済み】Android ADB デバイスがオフラインで、コマンドを発行できない。
-
[解決済み】java.lang.RuntimeException: アクティビティを開始できない ComponentInfo
-
[解決済み】SDKの場所がandroid studioで見つからない。
-
[解決済み】アクティビティにない場所でのgetLayoutInflater()の呼び出し
-
[解決済み】getCheckedRadioButtonId()が無駄なintを返す?
-
[解決済み] Looper.prepare()を呼び出していないスレッドではハンドラを作成できない
-
[解決済み] android.intent.action.MAINの意味は何ですか?
-
[解決済み] アクティビティで本来追加されるウィンドウが流出した
-
[解決済み] ボディのスクロールを防止し、オーバーレイのスクロールを可能にする
-
[解決済み】あるdivの上に別のdivを重ねる方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】まだ警告が出る:設定 'compile' は時代遅れで 'implementation' に置き換わった。
-
[解決済み】アンドロイドクロームブラウザのモバイルウェブアプリケーションのメニューでHTMLユニコード ☰が検出されない。
-
[解決済み】Android Studio。adbバージョン」の結果を取得できない
-
[解決済み】新しいAVDを作成すると、CPU/ABIフィールドに「システムイメージがインストールされていません」と表示される。
-
[解決済み】sendUserActionEvent()がnullである。
-
[解決済み】android.content.res.Resources$NotFoundExceptionの取得:androidにリソースが存在する場合でも例外が発生する。
-
[解決済み] Looper.prepare()を呼び出していないスレッドではハンドラを作成できない
-
[解決済み] SDKの場所がandroid studioで見つからない
-
[解決済み] setBackgroundDrawable() 非推奨
-
[解決済み】他のアプリ(FacebookのChat Headsなど)の上に描画するためのAPIは何ですか?)