2013-12-12 15 views
16

Ho una classe MyView che estende la classe View. MyView dovrebbe disegnare un triangolo pieno. Ho disegnato un triangolo ma non riesco a farlo riempire. Questo è il mio metodo OnDraw():Come disegnare il triangolo pieno su 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); 
} 

Questo è ciò che ottengo come risultato:

enter image description here

risposta

20

ho trovato la risposta

@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

la prima riga deve essere spostata. Altrimenti inizierà a disegnare dal punto (0, 0). Non è un problema in questo caso, ma l'ho affrontato dal momento che volevo disegnare dal centro. – lucasjmatias

0

vorrei far notare che non si dovrebbe mai initiialize un oggetto da OnDraw(), come viene chiamato più volte e porta a problemi di prestazioni.

0

Questa risposta fornisce un po 'di chiarezza su dove provengono i numeri forniti nella risposta da @Egis. (Questo sarà disegnare un testa in giù triangolo equilatero ed è scritto in Kotlin)

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

La funzione altezza get è Pythagoras' Theorem e sarà sempre trovare l'altezza di un triangolo equilatero di essere ~ 87% della sua lunghezza del lato

Gist può essere trovato qui, contiene il codice per l'altra direzione