2010-08-17 7 views
70

Alors je dessine ce triangle android en utilisant le code ci-dessous dans ma méthode de tirage:Comment dessiner un triangle rempli de toile android?

paint.setARGB(255, 153, 29, 29); 
paint.setStyle(Paint.Style.FILL_AND_STROKE); 
paint.setAntiAlias(true); 

Path path = new Path(); 
path.moveTo(point1_returned.x, point1_returned.y); 
path.lineTo(point2_returned.x, point2_returned.y); 
path.moveTo(point2_returned.x, point2_returned.y); 
path.lineTo(point3_returned.x, point3_returned.y); 
path.moveTo(point3_returned.x, point3_returned.y); 
path.lineTo(point1_returned.x, point1_returned.y); 
path.close(); 

canvas.drawPath(path, paint); 

Les pointX_returned sont les coordonnées que je suis en train des champs. Ce sont essentiellement des latitudes et des longitudes. Le résultat est un joli triangle mais l'initié est vide et donc je peux voir la carte. Y a-t-il un moyen de le remplir d'une manière ou d'une autre?

+0

Comme je l'ai posté dans ma réponse, ne déplacez pasTo() après chaque ligneTo(), c'est tout ce qu'il y a. –

+0

Je sais que c'est une vieille question qui a déjà une réponse (incorrecte) acceptée, et vous avez également posté votre solution finale qui fonctionne ... mais vous ne dites pas pourquoi cela fonctionne, et j'espère que mon commentaire peut sauver quelqu'un le temps Je viens juste de passer à autre chose :) –

Répondre

35

Vous devez sans doute faire quelque chose comme:

Paint red = new Paint(); 

red.setColor(android.graphics.Color.RED); 
red.setStyle(Paint.Style.FILL); 

Et utiliser cette couleur pour votre chemin, au lieu de votre ARVB. Assurez-vous que le dernier point de votre chemin se termine sur le premier, cela a du sens aussi.

Dites-moi si cela fonctionne s'il vous plaît!

+0

Malheureusement, cela n'aide pas –

+0

@Nicolas Que faut-il utiliser à la place d'ARGB, si nous devons personnaliser la couleur avec la valeur RVB au lieu d'utiliser des valeurs prédéfinies? –

66

Ok, je l'ai fait. Je partage ce code au cas où quelqu'un d'autre en aurait besoin:

super.draw(canvas, mapView, true); 

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

paint.setStrokeWidth(2); 
paint.setColor(android.graphics.Color.RED);  
paint.setStyle(Paint.Style.FILL_AND_STROKE); 
paint.setAntiAlias(true); 

Point point1_draw = new Point();   
Point point2_draw = new Point();  
Point point3_draw = new Point(); 

mapView.getProjection().toPixels(point1, point1_draw); 
mapView.getProjection().toPixels(point2, point2_draw); 
mapView.getProjection().toPixels(point3, point3_draw); 

Path path = new Path(); 
path.setFillType(Path.FillType.EVEN_ODD); 
path.moveTo(point1_draw.x,point1_draw.y); 
path.lineTo(point2_draw.x,point2_draw.y); 
path.lineTo(point3_draw.x,point3_draw.y); 
path.lineTo(point1_draw.x,point1_draw.y); 
path.close(); 

canvas.drawPath(path, paint); 

//canvas.drawLine(point1_draw.x,point1_draw.y,point2_draw.x,point2_draw.y, paint); 

return true; 

Merci pour l'indice Nicolas!

+4

Je suis sûr que vous n'avez pas besoin du dernier 'lineTo()'. 'close()' le fait automatiquement. – Timmmm

+0

@Timmmm J'ai un test, vous avez raison, pas besoin de la dernière ligne à(). Merci. – banxi1988

+0

Merci beaucoup. Je ne sais pas pourquoi j'ai eu autant de problèmes à dessiner un triangle, mais j'ai passé les 20 dernières minutes avec divers bugs sur ce petit problème. –

10

vous pouvez également utiliser Vertice:

private static final int verticesColors[] = { 
    Color.LTGRAY, Color.LTGRAY, Color.LTGRAY, 0xFF000000, 0xFF000000, 0xFF000000 
}; 
float verts[] = { 
    point1.x, point1.y, point2.x, point2.y, point3.x, point3.y 
}; 
canvas.drawVertices(Canvas.VertexMode.TRIANGLES, verts.length, verts, 0, null, 0, verticesColors, 0, null, 0, 0, new Paint()); 
+2

Je ne pense pas que cette solution gère des formes remplies. (ne peut pas tester, je n'ai pas mon IDE pour l'instant) –

+3

Cela semble être la solution la plus performante, mais malheureusement, cette méthode n'est pas supportée sur les vues accélérées par le matériel. Vous pouvez désactiver l'accélération matérielle, mais alors vous perdez ses gains de performance: http://developer.android.com/guide/topics/graphics/hardware-accel.html – SurlyDre

4
private void drawArrows(Point[] point, Canvas canvas, Paint paint) { 

    float [] points = new float[8];    
    points[0] = point[0].x;  
    points[1] = point[0].y;  
    points[2] = point[1].x;  
    points[3] = point[1].y;   
    points[4] = point[2].x;  
    points[5] = point[2].y;    
    points[6] = point[0].x;  
    points[7] = point[0].y; 

    canvas.drawVertices(VertexMode.TRIANGLES, 8, points, 0, null, 0, null, 0, null, 0, 0, paint); 
    Path path = new Path(); 
    path.moveTo(point[0].x , point[0].y); 
    path.lineTo(point[1].x,point[1].y); 
    path.lineTo(point[2].x,point[2].y); 
    canvas.drawPath(path,paint); 

} 
+0

Cela fonctionne! Ne pas oublier d'utiliser paint.setAntiAlias ​​(true) pour obtenir un triangle lisse. –

+1

À quoi sert DrawVertices? – PsiX

3

Vous devez retirer path.moveTo après la première initiale.

Path path = new Path(); 
path.moveTo(point1_returned.x, point1_returned.y); 
path.lineTo(point2_returned.x, point2_returned.y); 
path.lineTo(point3_returned.x, point3_returned.y); 
path.lineTo(point1_returned.x, point1_returned.y); 
path.close(); 
+0

Je n'ai pas 3 points mais j'ai seulement un point x nad y comment puis-je dessiner un triangle à partir de ce point. – Pranav

3

En utilisant @ la réponse de Pavel comme guide, voici une méthode d'assistance si vous n'avez pas les points, mais ont commencer x, y et la hauteur et la largeur. Aussi peut dessiner inversé/à l'envers - ce qui est utile pour moi car il était utilisé comme fin de barchart vertical.

private void drawTriangle(int x, int y, int width, int height, boolean inverted, Paint paint, Canvas canvas){ 

     Point p1 = new Point(x,y); 
     int pointX = x + width/2; 
     int pointY = inverted? y + height : y - height; 

     Point p2 = new Point(pointX,pointY); 
     Point p3 = new Point(x+width,y); 


     Path path = new Path(); 
     path.setFillType(Path.FillType.EVEN_ODD); 
     path.moveTo(p1.x,p1.y); 
     path.lineTo(p2.x,p2.y); 
     path.lineTo(p3.x,p3.y); 
     path.close(); 

     canvas.drawPath(path, paint); 
    } 
4

enter image description here

Cette fonction indique comment créer un triangle de bitmap. C'est, créer une image recadrée en forme triangulaire. Essayez le code ci-dessous ou download demo example

public static Bitmap getTriangleBitmap(Bitmap bitmap, int radius) { 
     Bitmap finalBitmap; 
     if (bitmap.getWidth() != radius || bitmap.getHeight() != radius) 
      finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, 
        false); 
     else 
      finalBitmap = bitmap; 
     Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(), 
       finalBitmap.getHeight(), Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(output); 

     Paint paint = new Paint(); 
     final Rect rect = new Rect(0, 0, finalBitmap.getWidth(), 
       finalBitmap.getHeight()); 

     Point point1_draw = new Point(75, 0); 
     Point point2_draw = new Point(0, 180); 
     Point point3_draw = new Point(180, 180); 

     Path path = new Path(); 
     path.moveTo(point1_draw.x, point1_draw.y); 
     path.lineTo(point2_draw.x, point2_draw.y); 
     path.lineTo(point3_draw.x, point3_draw.y); 
     path.lineTo(point1_draw.x, point1_draw.y); 
     path.close(); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(Color.parseColor("#BAB399")); 
     canvas.drawPath(path, paint); 
     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     canvas.drawBitmap(finalBitmap, rect, rect, paint); 

     return output; 
    } 

La fonction retourne au-dessus d'une image dessinée sur la toile triangulaire. Read more

1

Ne pas moveTo() après chaque lineTo()

En d'autres termes, supprimer tous les moveTo() sauf la première. Sérieusement, si je ne fais que copier-coller le code OP et supprimer les appels inutiles moveTo(), cela fonctionne.

Rien d'autre ne doit être fait.


EDIT: Je sais que l'OP déjà affiché sa « solution finale de travail », mais il n'a pas déclaré pourquoi cela fonctionne. La raison réelle était assez surprenante pour moi, alors j'ai ressenti le besoin d'ajouter une réponse.

Questions connexes