Pregunta

Estoy trabajando en una interfaz de usuario de aplicación móvil que tiene un panel con impulso (para desplazamiento suave) y actualmente estoy actualizando la interfaz de usuario que dura el desplazamiento suave utilizando el siguiente código:

private void scrollKinetic()
{
    while (_curState == States.KineticScroll)
    {
        //  This gets how far the panel will move with the current velocity, then updates the velocity according to the current friction.
        var distY = GetDistance(scrVelocity.Y);
        var distX = GetDistance(scrVelocity.X);

        if (distY + distX <= 0)  //  Friction will eventually make distX and distY both 0
        {
            _curState = States.Idle;
            Invalidate();
            break;
        }

        //  CalculatePosition will move the panel accordingly.

        CalculatePosition(distY, scrVelocity.Y, false);
        CalculatePosition(distX, scrVelocity.X, true);

        Invalidate();
        friction++;
        Application.DoEvents();
    }
}

Como puedes ver, Application.DoEvents(); ¡Está criando su fea cabeza! Quiero deshacerme de él, pero no puedo pensar en ninguna forma de recorrer y actualizar la interfaz de usuario. ¡Cualquier ayuda/idea sería excelente!

Estoy haciendo esto en el .net CF, pero creo que es un problema de diseño, por lo que no creo que la plataforma importe demasiado.

¿Fue útil?

Solución 2

Puede intentar eliminar el bucle (y todas las llamadas de APP.Doevent), hacer una llamada a KineticsCroll en su método OnPaint () y luego llamar a Invalidate () en su método KineticsCroll.

Veo que tienes algún tipo de seguimiento estatal, por lo que puedes decir algo como:

if(_curState == States.KineticScroll)
    KineticScroll();

En su método OnPaint (), de esa manera solo lo llama cuando su estado es apropiado.

Básicamente, su bucle va de un bucle local a: OnPaint -> KineticScroll -> Invalidate -> OnPaint...etc ¡De esa manera obtienes el mismo bucle, sin llamar a los doevents!

Otros consejos

Crearía un temporizador que actuaría como un "bucle de juego": ejecutar X Times por segundo.
También realizaría un seguimiento de cuánto tiempo transcurrido desde la última llamada para que pueda calcular cuánto mover en función de ese tiempo transcurrido. Para un rendimiento adicional, el temporizador podría iniciarse y detenerse solo si hay movimiento.

Dependiendo del tipo de temporizador que use, es posible que deba reunir sus llamadas de actualización de la interfaz de usuario al hilo de la interfaz de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top