Sentier de balle de dessin Android

Il y a des balles dans mon application qui se déplacent à travers l'affichage. Ils dessinent comme je le veux. Mais maintenant, je veux dessiner le chemin derrière eux.

Tout ce que je pourrais faire est juste dessiner par canvas.drawPath quelque chose comme la photo suivante:

  • Partage de NavigationView avec toutes les activités?
  • Ajout d'un support de clavier approprié à RecyclerView
  • Lancer une application depuis une autre application sur Android
  • Retard Android en utilisant le gestionnaire
  • Aucune ressource trouvée qui correspond au nom donné 'android: Theme.Holo.Light'
  • Android 6 EditText.setError ne fonctionne pas correctement
  • Je l'ai maintenant

    Mais ce n'est pas ce que je veux. Il devrait avoir une queue pointue et une couleur dégradée comme celle-ci:

    Je veux cela

    Je ne sais pas comment le faire. BitmapShader essayé – ne pouvait pas faire quelque chose de bien. Aidez-moi, s'il vous plaît.

    Code:

    Tout d'abord, il existe une classe Point pour la position affichée:

     class Point { float x, y; ... } 

    Et la piste est stockée en file d'attente de Point :

     private ConcurrentLinkedQueue<Point> trail; 

    Peu importe comment il remplit, il suffit de savoir qu'il a une limite de taille:

     trail.add(position); if(trail.size() > TRAIL_MAX_COUNT) { trail.remove(); } 

    Et le dessin s'est produit dans la méthode DrawTrail :

     private void DrawTrail(Canvas canvas) { trailPath.reset(); boolean isFirst = true; for(Point p : trail) { if(isFirst) { trailPath.moveTo(px, py); isFirst = false; } else { trailPath.lineTo(px, py); } } canvas.drawPath(trailPath, trailPaint); } 

    Soit dit en passant, trailPaint est vraiment une peinture très grosse 🙂

     trailPaint = new Paint(); trailPaint.setStyle(Paint.Style.STROKE); trailPaint.setColor(color); trailPaint.setStrokeWidth(radius * 2); trailPaint.setAlpha(150); 

  • Erreur de construction multiprojet gradle: le paquet n'existe pas
  • Re-lancement du bouton Activity on Home, mais ... seulement la première fois
  • FragmentManager.getFragmens (). Size () ne diminuent pas après FragmentTransaction.remove (Fragment)
  • Bus événementiel et cycle de vie des composants Android
  • Comment configurer scheme_gravity par programme?
  • ViewPager avec une page contenant plusieurs Fragments "java.lang.IllegalArgumentException: Aucune vue n'a été trouvée pour l'identifiant"
  • 2 Solutions collect form web for “Sentier de balle de dessin Android”

    Je vois que vous voulez voir un dégradé sur le chemin de la balle, vous pourriez utiliser quelque chose comme ça

      int x1 = 0, y1 = 0, x2 = 0, y2 = 40; Shader shader = new LinearGradient(0, 0, 0, 40, Color.WHITE, Color.BLACK, TileMode.CLAMP); trailPaint = new Paint(); trailPaint.setShader(shader); 

    C'est ce que vous devriez changer votre trailPaint et voir si cela fonctionne.

    Fourni à partir d' ici .

    J'ai trouvé une solution. Mais pensez toujours que ce n'est pas le meilleur.

    Tout d'abord, les champs de ma classe sont utilisés pour cette tâche.

     static final int TRAIL_MAX_COUNT = 50; //maximum trail array size static final int TRAIL_DRAW_POINT = 30; //number of points to split the trail for draw private ConcurrentLinkedQueue<Point> trail; private Paint[] trailPaints; private float[][] trailPoss, trailTans; private Path trailPath; 

    En plus de l'objet trailPath , j'ai utilisé l'objet PathMeasure pour diviser le chemin vers plusieurs parties égales.

    Après avoir rempli l'objet du tableau de piste ajouté, l'appel de la fonction de calcul du sentier.

     lastTrailAdd = now; trail.add(pos.Copy()); if (trail.size() > TRAIL_MAX_COUNT) { trail.remove(); } FillTrail(); 

    Ensuite, ma fonction FillTrail .

     private void FillTrail() { trailPath.reset(); boolean isFirst = true; for(Point p : trail) { if(isFirst) { trailPath.moveTo(px, py); trailPoss[0][0] = px; trailPoss[0][1] = py; isFirst = false; } else { trailPath.lineTo(px, py); } } PathMeasure path = new PathMeasure(trailPath, false); float step = path.getLength() / TRAIL_DRAW_POINT; for(int i=0; i<TRAIL_DRAW_POINT; i++) { path.getPosTan(step * i, trailPoss[i], trailTans[i]); } } 

    Il s'est séparé du fil de dessin. Le code suivant est la fonction de dessin.

     private void DrawTrail(Canvas canvas) { if(trail.size() > 1) { float prevWidthHalfX = 0f, prevWidthHalfY = 0f, prevX = 0f, prevY = 0f; Path trailStepRect = new Path(); boolean isFirst = true; for (int i = 0; i < TRAIL_DRAW_POINT; i++) { float currWidthHalf = (float) (radius) * i / TRAIL_DRAW_POINT / 2f, currWidthHalfX = currWidthHalf * trailTans[i][1], currWidthHalfY = currWidthHalf * trailTans[i][0], currX = trailPoss[i][0], currY = trailPoss[i][1]; if (!isFirst) { trailStepRect.reset(); trailStepRect.moveTo(prevX - prevWidthHalfX, prevY + prevWidthHalfY); trailStepRect.lineTo(prevX + prevWidthHalfX, prevY - prevWidthHalfY); trailStepRect.lineTo(currX + currWidthHalfX, currY - currWidthHalfY); trailStepRect.lineTo(currX - currWidthHalfX, currY + currWidthHalfY); canvas.drawPath(trailStepRect, trailPaints[i]); } else { isFirst = false; } prevX = currX; prevY = currY; prevWidthHalfX = currWidthHalfX; prevWidthHalfY = currWidthHalfY; } } } 

    Le point principal est le dessin par pièces avec différentes peintures. Plus près de la balle – élargissez le sentier. Je pense que je l'optimiserai, mais c'est déjà un travail.

    Si vous voulez regarder comment il semble, installez simplement mon application à partir de Google Play .

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.