Frage Wie zeichne ein gefülltes Dreieck in android Leinwand?


Also zeichne ich dieses Dreieck in android Karten mit dem folgenden Code in meiner Zeichenmethode:

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);

Der PointX_returned sind die Koordinaten, die ich von den Feldern bekomme. Sie sind im Grunde Breitengrade und Längengrade. Das Ergebnis ist ein schönes Dreieck, aber der Insider ist leer und deshalb kann ich die Karte sehen. Gibt es eine Möglichkeit, es irgendwie zu füllen?


75
2017-08-17 09:37


Ursprung


Antworten:


Sie müssen wahrscheinlich etwas tun wie:

Paint red = new Paint();

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

Und verwenden Sie diese Farbe für Ihren Pfad anstelle von Ihrem ARGB. Stellen Sie sicher, dass der letzte Punkt Ihres Pfades auf dem ersten endet, es macht auch Sinn.

Sag mir bitte, ob es funktioniert!


36
2017-08-17 09:50



Ok ich habe es getan. Ich teile diesen Code für den Fall, dass ihn jemand benötigt:

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;

Danke für den Hinweis Nicolas!


69
2017-08-17 10:58



Sie können auch Vertice verwenden:

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());

10
2017-08-18 07:51



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);

}

4
2018-05-08 11:06



enter image description here

Diese Funktion zeigt, wie ein Dreieck aus einer Bitmap erstellt wird. Erstellen Sie also ein dreieckig zugeschnittenes Bild. Probieren Sie den Code unter oder aus Demo-Beispiel herunterladen

 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;
    }

Die obige Funktion gibt ein dreieckiges Bild auf Leinwand zurück. Weiterlesen


4
2018-01-01 10:52



Sie müssen path.moveTo nach dem ersten Initial entfernen.

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();

3
2017-12-01 15:45



Wenn Sie @ Pavels Antwort als Leitfaden verwenden, finden Sie hier eine Hilfsmethode, wenn Sie die Punkte nicht haben, aber x, y und Höhe und Breite haben. Kann auch umgekehrt / umgedreht zeichnen - was für mich nützlich ist, da es als Ende des vertikalen Balkendiagramms verwendet wurde.

 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);
    }

3
2018-03-08 17:06



Nicht moveTo() nach jedem lineTo()

Mit anderen Worten, entfernen Sie alle moveTo() außer dem ersten.

Ernsthaft, wenn ich nur OP-Code kopiere und das unnötige entferne moveTo() Anrufe, es funktioniert.

Nichts anderes muss getan werden.


EDIT: Ich weiß, dass der OP bereits seine "letzte Arbeitslösung" gepostet hat, aber er hat nicht gesagt Warum Es klappt. Der eigentliche Grund war für mich ziemlich überraschend, so dass ich das Bedürfnis verspürte, eine Antwort hinzuzufügen.


1
2017-07-14 12:29