他のすべてのアプリケーションの上に表示されるoverlay
ジェスチャ検出器を作りたいと思います。 オーバーレイはService
から開始されます。オーバーレイでタッチイベントを検出してさらにそれらを渡す
私は触れてからタッチイベントがが何らかの形で記録され、現在アクティブなアプリケーションにさらに派遣することができアイコンを重ねた場合にだけチェックするために、サンプルサービスを作った:
class GestureDetectorService : Service() {
override fun onBind(intent: Intent?): IBinder? = null
val windowManager: WindowManager
get() = getSystemService(Context.WINDOW_SERVICE) as WindowManager
var iv: AppCompatImageView? = null
override fun onCreate() {
super.onCreate()
iv = AppCompatImageView(this)
iv?.setImageResource(R.drawable.icon)
iv?.setOnTouchListener { view, motionEvent ->
when (motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
Log.d("Click", "From icon")
false
}
else -> false
}
}
val params: WindowManager.LayoutParams = WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT
, WindowManager.LayoutParams.WRAP_CONTENT
, WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
or WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
, PixelFormat.TRANSLUCENT)
params.gravity = Gravity.TOP or Gravity.LEFT
params.x = 100
params.y = 100
windowManager.addView(iv, params)
}
override fun onDestroy() {
super.onDestroy()
iv.let { windowManager.removeView(iv) }
}
}
運。
たとえば、ユーザーが特定の速度のFling
を実行するとき、または画面上で特定の形状を「描画」するときを検出したいとします。これは、たとえばメモ帳の起動をトリガーします。
しかし、通常のアプリのやりとりをブロックすることは望ましくありません。ユーザーは通常どおりにアプリが起動されたものとやり取りできなければなりません。
Kotlinの簡潔な答えはすごくいいですが、もしあなたがJavaで何かを考え出すなら、それも素晴らしいでしょう。
すぐにお返事ありがとうございます。私は、まれなことではないかもしれないと思っていました。RedMoonやMessengerのような他のアプリの上にさまざまな種類のアプリを描いています。だから、画面上に何かを描いたり、触ったり、何かを描いたり触れたりすることはできないと思っていますが、それ以上の伝播はありませんか?回避策はありますか、これは間違いなくブロックされていますか? – laszlo
@laszlo:「スクリーンに何かを描いても、触ったり、何かを描いたり触れたりすることはできませんが、それ以上は伝播しません。 - 正しい。 "回避策はありますか?" - セキュリティ上の欠陥を表すものではないと確信しています。 – CommonsWare