第一次调整ViewTreeObserver的按钮大小时会发生奇怪的变化

时间:2019-05-15 18:17:54

标签: android kotlin android-viewtreeobserver

我正在使用android kotlin,并且正在做一个计算器,它具有两种不同的模式:算术和普通。我通过开关控制它是否处于算术模式,如果不是,则处于正常模式。

我有一种算法来调整所有设备的按钮大小,在viewTreeObserver中执行该算法,然后根据计算器模式显示/隐藏一些按钮。

问题是它在第一次执行时无法正确调整大小,但是当我进入设置时,将开关更改为off(正常模式),它会正确调整大小,然后我将其更改为on(算术模式),然后更改为可以完美调整大小的计算器片段。

FirstExecution Image

Changing mode Image

After changing configuration (GoodResizing) Image

我尝试进行一些调试,但是由于viewTreeObserver调用了很多次,所以它很累

对于两种不同的情况(普通和算术),调整大小算法总是返回相同的乘数

这是我使用viewTreeObserver的地方:

override fun onStart() {
        if (view!!.viewTreeObserver.isAlive){
            view!!.viewTreeObserver.addOnPreDrawListener {
                calculatorPresenter.setCalculatorModeInView()
                changeTypeFaceCalculator()
                changeSizeButtons(findButtonSize(viewInf))

                true
            }
        }
        super.onStart()

    }

这是调整按钮大小的算法,它接收一个容器并返回一个double值以将其与measuredwith相乘:

override fun findButtonSize(viewCalculadora: View?): Double {
        //1. Por defecto planteamos que el alto debe
        //   ser el mismo que el ancho (aspect 1:1 o sea 1)

        var multiplierPropuesto = 1.0

        //2. Calculamos el ancho de las vistas blancas
        //   basados en el ancho de la pantalla y los espacios entre vistas
        var espacioHorizontalPerItem  = 8.0
        var espaciadoTotalItemsHorizontal = (totalItemsHorizontal + 1) * espacioHorizontalPerItem
        var anchoItem = (viewCalculadora!!.measuredWidth - espaciadoTotalItemsHorizontal)/totalItemsHorizontal

        //3. Calculamos el alto resultante de toda la botonería con el aspect 1:1
        //   y tomando en cuenta los espacios entre botones
        var espacioVerticalPerItem  = 8.0
        var espaciadoTotalItemsVertical = (totalItemsVertical + 1) * espacioVerticalPerItem
        var altoResultante = (anchoItem * multiplierPropuesto * totalItemsVertical) + espaciadoTotalItemsVertical


        //4. Determinamos si es necesario cambiar el multiplier a
        //   un valor menor que 1 (viendo si el alto resulto mayor que el espacio disponible)
        var ajustar = (altoResultante > viewCalculadora.measuredHeight)


        //5. Repetimos el proceso de cambiar el multiplier a
        //   mientras sea necesario (lo bajamos de 1% en cada vuelta)
        //  Ej. Baja de 100% a 99%, luego de 99% a 98%, y así sucesivamente
        while (ajustar) {
            multiplierPropuesto -= 0.01
            altoResultante = (anchoItem * multiplierPropuesto * totalItemsVertical) + espaciadoTotalItemsVertical
            ajustar = (altoResultante > viewCalculadora.measuredHeight)
        }

        return multiplierPropuesto
    }

任何帮助将不胜感激。

0 个答案:

没有答案