我正在使用android kotlin,并且正在做一个计算器,它具有两种不同的模式:算术和普通。我通过开关控制它是否处于算术模式,如果不是,则处于正常模式。
我有一种算法来调整所有设备的按钮大小,在viewTreeObserver中执行该算法,然后根据计算器模式显示/隐藏一些按钮。
问题是它在第一次执行时无法正确调整大小,但是当我进入设置时,将开关更改为off(正常模式),它会正确调整大小,然后我将其更改为on(算术模式),然后更改为可以完美调整大小的计算器片段。
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
}
任何帮助将不胜感激。