Comment dessiner un polygone rempli dans Android?
Réponses
Trop de publicités?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.
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 .
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 :-).
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.