57 votes

Comment dessiner un polygone rempli?

Comment dessiner un polygone rempli dans Android?

115voto

michael Points 852

Android n'est pas une pratique drawPolygon(x_array, y_array, numberofpoints) action comme Java. Vous avez à marcher à travers la fabrication d'un Path objet point par point. Par exemple, pour faire un rempli de forme trapézoïdale pour une 3D mur du donjon, vous pouvez mettre tous vos points en x et y les matrices de code 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);

Reportez-vous à la Peinture et le Chemin d'accès à la documentation pour plus d'options, telles que les dégradés et addArc.

42voto

Adrian Faciu Points 6042

Vous devez définir l'objet paint 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' objet PATH .

11voto

Nux Points 1053

J'aime le faire en trois étapes ...

Étape 1. Créez un cours pointu ;-)

 /**
 * 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. Dessinez

     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 :-).

2voto

user1325094 Points 59

BTW: j'ai découvert qu'une fois que vous commencez à créer votre chemin, tout moveTo de commandes dans le chemin d'accès signifie que la forme est laissés vacants.

Il a un sens quand vous pensez à ce sujet, que Android/Java laisserait la forme vacants en tant que le moveTo représenterait une rupture dans le polygone.

Cependant j'ai vu des tutos comme ça Comment dessiner un triangle plein dans android toile?

qui ont moveTo après chaque lineTo. Même si cela peut entraîner un flux de polygone, Android suppose que moveTo constitue une rupture dans le polygone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X