J'aimerais animer le dessin d'un chemin, c'est-à-dire de l'avoir progressivement apparaître à l'écran. J'utilise la toile et mes meilleures devinons jusqu'à présent consiste à utiliser un objectivant pour prendre soin de l'animation. Cependant, je ne peux pas comprendre comment dessiner réellement le segment correspondant du chemin dans la méthode Ondraw (). Y a-t-il une méthode qui permettrait de faire cela? Aurais-je besoin d'impliquer des effets de chemin pour cela? P>
edit: strong> à l'aide d'un DashPatheffecte et définissez ses intervalles "ON" et "OFF" dans l'animation pour couvrir la partie du chemin que nous voulons dessiner pour cette étape semble fonctionner ici, mais Nécessite d'attribuer un nouveau Dashpatheffect pour chaque étape de l'animation. Je laisserai la question ouverte au cas où il y a une meilleure façon. P>
3 Réponses :
Autant que je sache, le seul moyen est de commencer par un chemin vide et d'avoir un alinéa qui appendez des points sur le chemin à intervalles définis, jusqu'à ce qu'il soit terminé. P>
Cela ferait une animation très approximative. Dites que le chemin ne se compose d'une courbe longue - elle n'a qu'un point de départ et d'arrêt et deux points de contrôle. Il n'y aurait aucun moyen d'animer cela en douceur en utilisant cette méthode.
Ensuite, vous obtiendrez un meilleur résultat en utilisant Patheffect. Vous auriez toujours besoin de la modification du patheffecte entre Redraws.
Oui, qui est pris en charge par Ob Ob Ob Ob Ob Ob Ob Obualimator. Dashpatheffect semble être la meilleure méthode jusqu'à présent, mais cela nécessite une nouvelle instance d'effet à chaque étape - je me demande si nous pouvons éviter cela.
Répondre à ma propre question, car j'ai trouvé une façon satisfaisante de le faire.
L'astuce consiste à utiliser un puis chaque fois que l'animateur d'objet met à jour la valeur de la longueur de la course, un nouveau Enfin, la méthode ONDRAW () utilise ce peintre pour dessiner le chemin, qui ne comprendra que la partie que nous voulons: p > ObjectAnimator code> pour modifier progressivement la longueur actuelle de la course et un
Dashpatheffect code> pour contrôler la longueur de la course en cours. Le
dashpatheffect code> aura son paramètre de tirets défini initialement sur les éléments suivants: p>
DashPatheffet code> est créé avec la nouvelle partie visible et définie sur le peintre Objet, et la vue est invalidée: p>
canvas.drawPath(path, mPaint);
Mais je veux dessiner une ligne pointillée aussi!
Pourquoi devrions-nous garder la valeur de phase à 0. Pouvez-vous expliquer la logique de la phase de valeur?
package com.nexoslav.dashlineanimatedcanvasdemo; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.animation.LinearInterpolator; import androidx.annotation.Nullable; public class CustomView extends View { float[] dashes = {30, 20}; Paint mPaint; private Path mPath; private void init() { mPaint = new Paint(); mPaint.setColor(Color.BLACK); mPaint.setStrokeWidth(10f); mPaint.setStyle(Paint.Style.STROKE); mPaint.setPathEffect(new DashPathEffect(dashes, 0)); mPath = new Path(); mPath.moveTo(200, 200); mPath.lineTo(300, 100); mPath.lineTo(400, 400); mPath.lineTo(1000, 200); mPath.lineTo(1000, 1000); mPath.lineTo(200, 400); ValueAnimator animation = ValueAnimator.ofInt(0, 100); animation.setInterpolator(new LinearInterpolator()); animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { Log.d("bla", "bla: " + valueAnimator.getAnimatedValue()); mPaint.setPathEffect(new DashPathEffect(dashes, (Integer) valueAnimator.getAnimatedValue())); invalidate(); } }); animation.setDuration(1000); animation.setRepeatMode(ValueAnimator.RESTART); animation.setRepeatCount(ValueAnimator.INFINITE); animation.start(); } public CustomView(Context context) { super(context); init(); } public CustomView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(mPath, mPaint); } }