Плавное движение всплывающего окна - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть всплывающее окно, которое отображается при нажатии на спиннер, которое загружает элементы для выбора. Пока все хорошо. Это всплывающее окно может расширяться и уменьшаться по высоте при нажатии на верхнюю часть всплывающего окна. Я сделал это, чтобы работать тоже. Моя проблема заключается в том, что когда представление расширяется или сжимается, возникает момент, когда представление не адаптируется к новым границам. Пытался сделать вид полной высоты и показать его в нижней половине экрана, но не смог этого сделать. Есть ли способ сделать настройки более плавными.

Мое всплывающее окно:

fun spinnerDropdownMenu(
    spinnerTextTitle: String,
    list: ArrayList<String>,
    v: View,
    preselected: String?
) {
    val displayMetrics = this.resources.displayMetrics
    val displayHeight = displayMetrics.heightPixels
    val density = displayMetrics.density

    val root = findViewById<ConstraintLayout>(R.id.root_view)
    0.5f.applyDim(root)

    val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    val popupView = inflater.inflate(R.layout.spinner_dropdown, root, false)


    val width = LinearLayout.LayoutParams.MATCH_PARENT
    val height = (displayHeight / density).toInt()

    val focusable = true

    val popupWindow = PopupWindow(popupView, width, height, focusable)


    val textView = popupView.findViewById<TextView>(R.id.spinner_textView)
    textView.text = spinnerTextTitle

    val listView = popupView.findViewById<ListView>(R.id.listView_items)

    val adapter = ListViewAdapter(this, list, preselected)
    listView.adapter = adapter

    val slideIn = Slide()
    slideIn.slideEdge = Gravity.BOTTOM
    popupWindow.enterTransition = slideIn

    val slideOut = Slide()
    slideOut.slideEdge = Gravity.BOTTOM
    popupWindow.exitTransition = slideOut

    popupWindow.showAtLocation(root, Gravity.BOTTOM, 0, 0)

    popupWindow.setOnDismissListener { clearDim(root) }
    popupView.findViewById<ImageView>(R.id.cross).setOnClickListener {
        popupWindow.dismiss()

    }
    popupView.findViewById<ListView>(R.id.listView_items)
        .setOnItemClickListener { _, _, position, _ ->
            val response = listView.adapter.getItem(position).toString()
            if (spinnerTextTitle == resources.getString(R.string.titlePhoneNumber)){
            (v as TextInputEditText).setText(response.substringAfter("(").substringBefore(")"), TextView.BufferType.EDITABLE)
            }else (v as TextInputEditText).setText(response, TextView.BufferType.EDITABLE)
            popupWindow.dismiss()
        }


    popupView.setOnTouchListener { _, event ->
        val dx = 100
        val dy = 100
        val rx: Int
        val ry: Int
        val sides: Int
        val topBot: Int

        when (event.action) {
            MotionEvent.ACTION_MOVE -> {
                rx = event.rawX.toInt()
                ry = event.rawY.toInt()
                sides = rx - dx
                topBot = ry - dy
                popupWindow.update(sides, -topBot, -1, (displayHeight - ry))
                true

            }
            MotionEvent.ACTION_DOWN -> {
                event.x.toInt()
                event.y.toInt()



                true
            }
            MotionEvent.ACTION_UP -> {
                event.x.toInt()
                event.y.toInt()
                true
            }
            else -> {
                true
            }
        }
    }

}
...