当覆盖窗口与其他覆盖窗口的位置相匹配时,如何在android中删除覆盖窗口?

时间:2021-01-01 13:01:42

标签: java android kotlin

所以基本上我想要做的是实现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)
    }
}

0 个答案:

没有答案