Comment dessiner un polygone rempli?

Comment dessiner un polygone rempli dans Android?

Vous devez définir l’object de peinture sur FILL

Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); 

Ensuite, vous pouvez dessiner ce que vous voulez, et il sera rempli.

 canvas.drawCircle(20, 20, 15, paint); canvas.drawRectangle(60, 20, 15, paint); 

etc.

Pour les formes plus complexes, vous devez utiliser l’ object PATH .

Android ne dispose pas d’une action pratique drawPolygon(x_array, y_array, numberofpoints) comme Java. Vous devez parcourir un object point par point. Par exemple, pour créer une forme trapézoïdale remplie pour un mur de donjon 3D, vous pouvez placer tous vos points dans les tableaux x et y puis coder comme suit:

 Paint wallpaint = new Paint(); wallpaint.setColor(Color.GRAY); wallpaint.setStyle(Style.FILL); Path wallpath = new Path(); wallpath.reset(); // only needed when reusing this path for a new build wallpath.moveTo(x[0], y[0]); // used for first point wallpath.lineTo(x[1], y[1]); wallpath.lineTo(x[2], y[2]); wallpath.lineTo(x[3], y[3]); wallpath.lineTo(x[0], y[0]); // there is a setLastPoint action but i found it not to work as expected canvas.drawPath(wallpath, wallpaint); 

Pour append un dégradé linéaire constant pour une certaine profondeur, vous pouvez coder comme suit. Remarque y [0] est utilisé deux fois pour garder le dégradé horizontal:

  wallPaint.reset(); // precaution when resusing Paint object, here shader replaces solid GRAY anyway wallPaint.setShader(new LinearGradient(x[0], y[0], x[1], y[0], Color.GRAY, Color.DKGRAY,TileMode.CLAMP)); canvas.drawPath(wallpath, wallpaint); 

Reportez-vous à la documentation Paint , Path et Canvas pour plus d’options, telles que les dégradés définis par des tableaux, l’ajout d’arcs et la pose d’un bitmap sur votre polygone.

J’aime le faire en trois étapes …

Étape 1. Créez une classe pointue 😉

 /** * Simple point */ private class Point { public float x = 0; public float y = 0; public Point(float x, float y) { this.x = x; this.y = y; } } 

Étape 2. Ajouter une méthode / fonction pour dessiner

 /** * Draw polygon * * @param canvas The canvas to draw on * @param color Integer representing a fill color (see http://developer.android.com/reference/android/graphics/Color.html) * @param points Polygon corner points */ private void drawPoly(Canvas canvas, int color, Point[] points) { // line at minimum... if (points.length < 2) { return; } // paint Paint polyPaint = new Paint(); polyPaint.setColor(color); polyPaint.setStyle(Style.FILL); // path Path polyPath = new Path(); polyPath.moveTo(points[0].x, points[0].y); int i, len; len = points.length; for (i = 0; i < len; i++) { polyPath.lineTo(points[i].x, points[i].y); } polyPath.lineTo(points[0].x, points[0].y); // draw canvas.drawPath(polyPath, polyPaint); } 

Étape 3. dessiner

  drawPoly(canvas, 0xFF5555ee, new Point[]{ new Point(10, 10), new Point(15, 10), new Point(15, 20) }); 

Oui, vous pourriez probablement le faire plus efficacement, mais probablement pas beaucoup plus lisible :-).

Dessiner un polygone avec les côtés x et le rayon personnalisé:

 private void drawPolygon(Canvas mCanvas, float x, float y, float radius, float sides, float startAngle, boolean anticlockwise, Paint paint) { if (sides < 3) { return; } float a = ((float) Math.PI *2) / sides * (anticlockwise ? -1 : 1); mCanvas.save(); mCanvas.translate(x, y); mCanvas.rotate(startAngle); Path path = new Path(); path.moveTo(radius, 0); for(int i = 1; i < sides; i++) { path.lineTo(radius * (float) Math.cos(a * i), radius * (float) Math.sin(a * i)); } path.close(); mCanvas.drawPath(path, paint); mCanvas.restore(); } 

BTW – J’ai découvert qu’une fois que vous commencez à créer votre chemin, toute commande moveTo dans le chemin signifie que la forme n’est pas remplie.

Lorsque vous y pensez, il est logique que Android / Java laisse la forme non remplie car moveTo représenterait une rupture dans le polygone.

Cependant, j’ai vu des tutoriels comme celui-ci Comment dessiner un sortingangle rempli dans la canvas Android?

qui ont moveTo après chaque ligneTo. Même si cela peut entraîner un polygone ininterrompu, Android suppose qu’un moveTo représente une rupture dans le polygone.

Ancienne question, mais une astuce pour quiconque trouve cela. Si vous incluez une police avec le polygone souhaité comme glyphe, vous pouvez utiliser la fonction drawText pour dessiner votre polygone.

L’inconvénient est que vous devez savoir à l’avance quelles formes vous aurez besoin. L’avantage est que si vous savez à l’avance, vous pouvez inclure une bibliothèque de formes sympa. Ce code suppose que vous avez une police appelée formes dans votre dossier assets / fonts de votre projet.

  TypeFace shapesTypeFace = Typeface.createFromAsset(getAssets(), "fonts/shapes.ttf"); Paint stopSignPaint = new Paint(); stopSignPaint.setColor(Color.RED); //set anti-aliasing so it looks nice stopSignPaint.setAntiAlias(true); stopSignPaint.setTextSize(200); stopSignPaint.setTypeface(shapesTypeFace); //will show up as a box or question mark since //the current display font doesn't have this glyph. //open the shapes font in a tool like Character Map //to copy and paste the glyph into your IDE //saving it as a variable makes it much easier to work with Ssortingng hexagonGlyph = "" Ssortingng sortingangleGlyph = "" ....whatever code you got... //arguments: text, x coordinate, y coordinate, paint canvas.drawText(hexagonGlyph, 200, 100, stopSignPaint); //make it into a go sign stopSignPaint.setColor(Color.Green); canvas.drawText(hexagonGlyph, 200, 100, stopSignPaint); //make a tiny one stopSignPaint.setTextSize(20); stopSignPaint.setColor(Color.RED); canvas.drawText(hexagonGlyph, 200, 100, stopSignPaint); //make a sortingangle canvas.drawText(sortingangleGlyph, 200, 100, stopSignPaint); 

Essayez ceci ou voyez la démo complète

  Paint paint = new Paint(); paint.setColor(Color.parseColor("#BAB399")); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));