2010-05-14 17 views

Respuesta

71

Mientras respuesta Steelbytes' probablemente le dará un mayor control sobre las secciones individuales del gradiente, puede hacerlo sin la ruta:

protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    Paint p = new Paint(); 
    // start at 0,0 and go to 0,max to use a vertical 
    // gradient the full height of the screen. 
    p.setShader(new LinearGradient(0, 0, 0, getHeight(), Color.BLACK, Color.WHITE, Shader.TileMode.MIRROR)); 
    canvas.drawPaint(p); 
} 
+31

bien, pero NUNCA construye la instancia de Paint en los métodos onDraw (...) – ebtokyo

+0

@ebtokyo: ¿Por motivos de rendimiento? ¿Lo guardaría en caché en la creación y actualizaría su tamaño en cada onDraw (o tal vez en tamaño)? – idbrii

+0

Sí, por motivos de rendimiento. La pelusa comenta las asignaciones en onDraw() como esta: "Evite las asignaciones de objetos durante las operaciones de dibujo/disposición (preasignar y reutilizar en su lugar)" –

28

esto puede ayudar a

protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    int w = getWidth(); 
    int h = getHeight(); 
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG); 
    Path pth = new Path(); 
    pth.moveTo(w*0.27f,0); 
    pth.lineTo(w*0.73f,0); 
    pth.lineTo(w*0.92f,h); 
    pth.lineTo(w*0.08f,h); 
    pth.lineTo(w*0.27f,0); 
    p.setColor(0xff800000); 
    p.setShader(new LinearGradient(0,0,0,h,0xff000000,0xffffffff,Shader.TileMode.CLAMP)); 
    canvas.drawPath(pth,p); 
} 
Cuestiones relacionadas