2013-12-12 15 views
16

Ich habe Klasse MyView, die View-Klasse erweitert. MyView sollte ein gefülltes Dreieck zeichnen. Ich zeichnete ein Dreieck, aber ich kann es nicht füllen. Das ist mein OnDraw() Methode:Wie zeichne gefüllte Dreieck auf Android Canvas

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    Paint paint = new Paint(); 

    paint.setColor(android.graphics.Color.BLACK); 
    canvas.drawPaint(paint); 

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

    Point a = new Point(0, 0); 
    Point b = new Point(0, 100); 
    Point c = new Point(87, 50); 

    Path path = new Path(); 
    path.setFillType(FillType.EVEN_ODD); 
    path.moveTo(a.x, a.y); 
    path.lineTo(b.x, b.y); 
    path.moveTo(b.x, b.y); 
    path.lineTo(c.x, c.y); 
    path.moveTo(c.x, c.y); 
    path.lineTo(a.x, a.y); 
    path.close(); 

    canvas.drawPath(path, paint); 
} 

Dies ist, was ich als Ergebnis erhalten:

enter image description here

Antwort

20

ich die Antwort

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    Paint paint = new Paint(); 

    paint.setColor(android.graphics.Color.BLACK); 
    canvas.drawPaint(paint); 

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

    Point a = new Point(0, 0); 
    Point b = new Point(0, 100); 
    Point c = new Point(87, 50); 

    Path path = new Path(); 
    path.setFillType(FillType.EVEN_ODD); 
    path.lineTo(b.x, b.y); 
    path.lineTo(c.x, c.y); 
    path.lineTo(a.x, a.y); 
    path.close(); 

    canvas.drawPath(path, paint); 
} 
+4

die erste lineTo sollte moveTo sein. Andernfalls beginnt es mit dem Zeichnen von Punkt (0, 0). In diesem Fall kein Problem, aber ich sah es an, da ich aus der Mitte zeichnen wollte. – lucasjmatias

0

Ich möchte darauf hinweisen, dass Sie nie ein Objekt aus OnDraw(), wie es mehrmals aufgerufen wird, und führt zu Leistungsproblemen initiialize sollte.

0

Diese Antwort gibt ein wenig Klarheit darüber, woher die in der Antwort von @Egis angegebenen Zahlen stammen. (Dies wird ein umgekehrtes Dreieck zeichnen und wird in Kotlin geschrieben)

class TriangleView(context: Context?, attrs: AttributeSet?) : View(context, attrs) { 

    val paint = Paint() 
    val path = Path() 

    override fun onDraw(canvas: Canvas?) { 
     super.onDraw(canvas) 
     canvas ?: return 
     canvas.drawPath(configurePath(canvas.width.toFloat(), path), configurePaint(paint)) 
    } 

    fun getHeight(width: Double): Float { 
     return Math.sqrt((Math.pow(width, 2.0) - Math.pow((width/2), 2.0))).toFloat() 
    } 

    fun configurePaint(paint: Paint): Paint { 
     paint.color = android.graphics.Color.WHITE 
     paint.isAntiAlias = true 

     return paint 
    } 

    fun configurePath(width: Float, path: Path): Path { 
     path.lineTo((width/2f), getHeight(width.toDouble())) 
     path.lineTo(width, 0F) 
     path.lineTo(0f, 0f) 

     return path 
    } 
} 

Die get-Höhenfunktion Pythagoras' Theorem ist und wird immer die Höhe eines gleichseitigen Dreiecks zu finden sein ~ 87% seiner Seitenlänge

Gist kann hier gefunden werden, es enthält Code für die andere Richtung

Verwandte Themen