Question

Je travaille sur une interface utilisateur d'application mobile qui a un panneau avec de l'élan (pour le défilement en douceur) et je mets actuellement à jour l'interface utilisateur en train de faire du défilement en douceur en utilisant le code suivant:

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();
    }
}

Comme tu peux le voir, Application.DoEvents(); Élève sa tête laide! Je veux m'en débarrasser, mais je ne peux penser à aucun moyen de faire boucle et de mettre à jour l'interface utilisateur. Toute aide / idées serait excellente!

Je fais cela sur .NET CF, mais je pense que c'est un problème de conception, donc je ne pense pas que la plate-forme aura trop d'importance.

Était-ce utile?

La solution 2

Vous pouvez essayer de supprimer la boucle (et tous les appels app.DoEvent), passer un appel à KineticsCroll dans votre méthode onPaint (), puis appeler Invalidate () dans votre méthode KineticsCroll.

Je vois que vous avez une sorte de suivi d'état, vous pouvez donc dire quelque chose comme:

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

Dans votre méthode onpaint (), vous ne l'appelez que lorsque votre état est approprié.

Fondamentalement, votre boucle passe d'une boucle locale à: OnPaint -> KineticScroll -> Invalidate -> OnPaint...etc De cette façon, vous obtenez la même boucle, sans appel à Doevents!

Autres conseils

Je créerais une minuterie qui agirait comme une "boucle de jeu" - exécuter X fois par seconde.
Je garderais également une trace du temps écoulé depuis le dernier appel afin que vous puissiez calculer la quantité à déplacer en fonction de ce temps écoulé. Pour des performances supplémentaires, la minuterie pourrait être démarrée et arrêtée uniquement en cas de motion.

Selon le type de minuterie que vous utilisez, vous devrez peut-être rassembler vos appels de mise à jour d'interface utilisateur sur le fil d'interface utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top