所以基本上我想要做的是实现Facebook Messenger 聊天头的行为。我已经完成了有关处理点击事件和其他基本功能的大部分工作。但是当用户将此窗口拖动到某个位置时,我无法从 windowsmanager 中删除视图。我在该位置添加了另一个窗口,但我无法比较两个 windowsmanager 的位置。
第一个视图
val layoutparms: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
} else {
WindowManager.LayoutParams.TYPE_PHONE
}
Log.d("onStartCommand", "Service called")
createNotificationChannel()
val mParams: WindowManager.LayoutParams? = WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
layoutparms,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
)
val overTheAppview = LayoutInflater.from(applicationContext).inflate(R.layout.test, null)
val btn_mic=overTheAppview.findViewById<ImageView>(R.id.btn_mic)
val btn_settings=overTheAppview.findViewById<ImageView>(R.id.btn_settings)
val btn_list=overTheAppview.findViewById<ImageView>(R.id.list)
val btn_home=overTheAppview.findViewById<ImageView>(R.id.home)
val wm = applicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
mParams?.gravity = Gravity.START or Gravity.TOP
mParams?.x = 100
mParams?.y = 100
wm.addView(overTheAppview, mParams)
overTheAppview.setOnTouchListener(object : View.OnTouchListener {
private var initialX = 0
private var initialY = 0
private var initialTouchX = 0f
private var initialTouchY = 0f
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
val duration = event?.eventTime!! - event.downTime
if (event.action == MotionEvent.ACTION_DOWN) {
initialX = mParams?.x!!
initialY = mParams?.y!!
initialTouchX = event.rawX;
initialTouchY = event.rawY;
}
if (event.action == MotionEvent.ACTION_BUTTON_PRESS) {
Log.e("CLICK_EVENT", "Button Press")
}
if (event.action == MotionEvent.ACTION_UP) {
Log.e("CLICK_EVENT", "ACTION_UP")
counter1 = 0
if (testView1 != null) {
wm1?.removeView(testView1)
wm1 = null
testView1 = null
}
if (counter > 9) {
counter = 0
} else {
if (btn_home.visibility == View.GONE && btn_mic.visibility == View.GONE && btn_list.visibility == View.GONE && btn_settings.visibility == View.GONE) {
btn_home.visibility = View.VISIBLE
btn_mic.visibility = View.VISIBLE
btn_list.visibility = View.VISIBLE
btn_settings.visibility = View.VISIBLE
} else {
btn_home.visibility = View.GONE
btn_mic.visibility = View.GONE
btn_list.visibility = View.GONE
btn_settings.visibility = View.GONE
}
Log.e("CLICK_EVENT", "Event triggered")
counter = 0
}
return true
}
if (event.action == MotionEvent.ACTION_MOVE) {
counter++
counter1++
Log.e("CLICK_EVENT", "ACTION_MOVE")
if (counter1 == 10) {
cancelView()
Log.e("COUNTER", "-->$counter")
}
val location_params = overTheAppview.getLocationInWindow(arrary2)
var moveX_params = arrary2[0]
var moveY_params = arrary2[1]
mParams?.x = initialX + (event.rawX - initialTouchX).toInt()
mParams?.y = initialY + (event.rawY - initialTouchY).toInt();
Log.e("mParamsMove", "X-->${mParams?.x}")
Log.e("mParamsMove", "Y-->${mParams?.y}")
wm.updateViewLayout(overTheAppview, mParams)
return true
}
return false
}
})
取消视图是另一个窗口,它会显示取消图标,例如 Facebook 信使
fun cancelView() {
layoutparms= if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
} else {
WindowManager.LayoutParams.TYPE_PHONE
}
mParams = WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
layoutparms!!,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
)
testView1 = LayoutInflater.from(applicationContext).inflate(R.layout.test2, null)
Log.e("WIDTH", testView1?.width?.div(2)?.toDouble().toString())
val imageView = testView1!!.findViewById<ImageView>(R.id.cancel_position_image)
wm1 = applicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val location_params = testView1?.getLocationInWindow(aray)
x_params= aray[0]
y_params = aray[1]
Log.e("xparams", "X-->${x_params}")
Log.e("xparams", "Y-->${y_params}")
val mdisp: Display = wm1!!.defaultDisplay
val mdispSize = Point()
mdisp.getSize(mdispSize)
val maxX: Int = mdispSize.x
val maxY: Int = mdispSize.y
Log.e("maxY", "X-->${maxX}")
Log.e("maxY", "Y-->${maxY}")
mParams!!.gravity = Gravity.BOTTOM or Gravity.CENTER
if(!testView1!!.isAttachedToWindow) {
wm1!!.addView(testView1, mParams)
}
}