2012-06-02 7 views
5

Tengo una vista personalizada y un dibujable para dibujar sobre ella, pero por alguna razón el dibujable no se dibuja en el lienzo de la vista. He aquí cómo se crea el dibujable:Drawable no está dibujando en lienzo

int[] gradientColors=new int[] { 0xFFFF0000,0xFFFFFF00,0xFF00FF00, 
     0xFF00FFFF,0xFF0000FF,0xFFFF00FF,0xFFFF0000 }; 
gradient=new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, 
     gradientColors); 

Y aquí está la función onDraw:

@Override protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    int width=canvas.getWidth(); 
    int height=canvas.getHeight(); 
    gradientBitmap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); 
    canvas.setBitmap(gradientBitmap); 
    gradient.setBounds(0,0,width,height); 
    gradient.draw(canvas); 
} 

Gracias por cualquier ayuda.

+0

cuando gira el teléfono ¿Obtuviste algo? –

Respuesta

2

tratar de ver el código puede ser útil para que usted aprenda Haw de manejar dibujo de vistas personalizadas:

public class MainActivity extends Activity { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(new SampleView(this)); 
     } 

      private static class SampleView extends View { 
       private Rect mRect; 
       private GradientDrawable mDrawable; 

       public SampleView(Context context) { 
        super(context); 
        setFocusable(true); 

        mRect = new Rect(0, 0, 220, 120); 

    /*    GradientDrawable.Orientation BL_TR draw the gradient from the bottom-left to the top-right 
         BOTTOM_TOP draw the gradient from the bottom to the top 
         BR_TL draw the gradient from the bottom-right to the top-left 
         LEFT_RIGHT draw the gradient from the left to the right 
         RIGHT_LEFT draw the gradient from the right to the left 
         TL_BR draw the gradient from the top-left to the bottom-right 
         TOP_BOTTOM draw the gradient from the top to the bottom 
         TR_BL draw the gradient from the top-right to the bottom-left 
    */ 

        mDrawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, 
                new int[] { 0xFFFF0000, 0xFF00FF00, 
                 0xFF0000FF }); 
        mDrawable.setShape(GradientDrawable.RECTANGLE); 
        mDrawable.setGradientRadius((float)(Math.sqrt(2) * 60)); 
       } 

       static void setCornerRadius(GradientDrawable drawable, float r0, 
              float r1, float r2, float r3) { 
    /*    setCornerRadii 
        Specify radii for each of the 4 corners. For each corner, 
        the array contains 2 values, [X_radius, Y_radius]. 
        The corners are ordered top-left, top-right, bottom-right, 
        bottom-left 
    */ 
        drawable.setCornerRadii(new float[] { r0, r0, r1, r1, 
                  r2, r2, r3, r3 }); 
       } 

       @Override protected void onDraw(Canvas canvas) { 

        mDrawable.setBounds(mRect); 

        float r = 35; 

        canvas.save(); 
        canvas.translate(10, 10); 
        mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT); 
        setCornerRadius(mDrawable, r, r, 0, 0); 
        mDrawable.draw(canvas); 
        canvas.restore(); 

        canvas.translate(0, mRect.height() + 10); 
        canvas.save(); 
        canvas.translate(10, 10); 
        mDrawable.setGradientType(GradientDrawable.RADIAL_GRADIENT); 
        setCornerRadius(mDrawable, 0, 0, r, r); 
        mDrawable.draw(canvas); 
        canvas.restore(); 

        canvas.translate(0, mRect.height() + 10); 
        canvas.save(); 
        canvas.translate(10, 10); 
        mDrawable.setGradientType(GradientDrawable.SWEEP_GRADIENT); 
        setCornerRadius(mDrawable, 0, r, r, 0); 
        mDrawable.draw(canvas); 
        canvas.restore(); 


       } 
      } 
     } 

ACTUALIZACIÓN

public class MyView extends View { 
    private static int measuredWidth = 300; 
    private static int measuredHeight = 300; 
    private Rect mRect; 
    private GradientDrawable mDrawable; 

    public MyView(Context context) { 
     super(context); 
     initializeView(); 


    } 

    public MyView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initializeView(); 
    } 

    private void initializeView() { 

     mDrawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, 
       new int[] { 0xFFFF0000,0xFFFFFF00,0xFF00FF00, 
       0xFF00FFFF,0xFF0000FF,0xFFFF00FF,0xFFFF0000 }); 
     mDrawable.setShape(GradientDrawable.RECTANGLE); 
     mDrawable.setGradientRadius((float)(Math.sqrt(2) * 60)); 
    } 

    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initializeView(); 
    } 

    @Override protected void onDraw(Canvas canvas) { 
     mRect = new Rect(0, 0, measuredWidth, measuredHeight); 
     mDrawable.setBounds(mRect); 
     canvas.save(); 
     canvas.translate(10, 10); 
     mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT); 
     //setCornerRadius(mDrawable, r, r, 0, 0); 
     mDrawable.draw(canvas); 
     canvas.restore(); 

    } 

yo probamos este para que se basa en su código y funciona, excepto que he arreglado la altura y el ancho:

+0

Intenté usar canvas.save, translate, restore pero obtuve el mismo resultado. El dibujable simplemente no dibuja en absoluto. – user940016

+0

el código que le proporcioné no está funcionando? lo pruebo y funciona !! –

+0

Solo tomé secciones relevantes de su código (es decir, todas las operaciones de salvar y restaurar lienzo). No intenté ejecutar tu ejemplo como lo proporcionaste. Puede que me esté perdiendo algo, realmente no sé ... – user940016

Cuestiones relacionadas