2010-06-03 13 views
11

Estaba tratando de obtener gráficos 2D en Android. Como ejemplo quiero implementar un dibujable costumbre, el documento presentado en mi actividadImplementación de un drawable personalizado en Android

he definido un dibujable personalizado mediante la extensión de dibujable Android como se menciona más adelante

class myDrawable extends Drawable { 

    private static final String TAG = myDrawable.class.getSimpleName(); 
    private ColorFilter cf; 
    @Override 
    public void draw(Canvas canvas) { 


    //First you define a colour for the outline of your rectangle 

    Paint rectanglePaint = new Paint(); 
    rectanglePaint.setARGB(255, 255, 0, 0); 
    rectanglePaint.setStrokeWidth(2); 
    rectanglePaint.setStyle(Style.FILL); 

    //Then create yourself a Rectangle 
    RectF rectangle = new RectF(15.0f, 50.0f, 55.0f, 75.0f); //in pixels 


    Log.d(TAG,"On Draw method"); 
    // TODO Auto-generated method stub 
    Paint paintHandl = new Paint(); 
    // paintHandl.setColor(0xaabbcc); 
    paintHandl.setARGB(125, 234, 213, 34); 
    RectF rectObj = new RectF(5,5,25,25); 
    canvas.drawRoundRect(rectangle, 0.5f, 0.5f, rectanglePaint); 

    } 

    @Override 
    public int getOpacity() { 
    // TODO Auto-generated method stub 
    return 100; 
    } 

    @Override 
    public void setAlpha(int alpha) { 
    // TODO Auto-generated method stub 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
    // TODO Auto-generated method stub 
    this.cf = cf; 
    } 
} 

Estoy tratando de obtener esta muestra en mi actividad, como se muestra a continuación

public class custDrawable extends Activity { 
/** Called when the activity is first created. */ 


LinearLayout layObj = null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     layObj = (LinearLayout) findViewById(R.id.parentLay); 
     ImageView imageView = (ImageView) findViewById(R.id.icon2); 
     myDrawable myDrawObj = new myDrawable(); 
     imageView.setImageDrawable(myDrawObj); 
     imageView.invalidate(); 
// layObj.addView(myDrawObj, params); 

    } 
} 

Pero cuando corro la aplicación me veo ninguna rectángulo en la actividad, puede alguien ayudarme? ¿Dónde me estoy equivocando?

Respuesta

11

Tu problema es getOpacity() método. 100 no es un valor válido. Debe usar un valor de PixelFormat. Además, debe crear su RectF y Paint en el constructor y luego simplemente ajustar los valores en draw() para no crear tantos objetos que necesiten basura recolectada. De esta manera:

public class Square extends Drawable 
{ 
    private final Paint mPaint; 
    private final RectF mRect; 

    public Square() 
    { 
     mPaint = new Paint(); 
     mRect = new RectF(); 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     // Set the correct values in the Paint 
     mPaint.setARGB(255, 255, 0, 0); 
     mPaint.setStrokeWidth(2); 
     mPaint.setStyle(Style.FILL); 

     // Adjust the rect 
     mRect.left = 15.0f; 
     mRect.top = 50.0f; 
     mRect.right = 55.0f; 
     mRect.bottom = 75.0f; 

     // Draw it 
     canvas.drawRoundRect(mRect, 0.5f, 0.5f, mPaint); 
    } 

    @Override 
    public int getOpacity() 
    { 
     return PixelFormat.OPAQUE; 
    } 

    @Override 
    public void setAlpha(int arg0) 
    { 
    } 

    @Override 
    public void setColorFilter(ColorFilter arg0) 
    { 
    } 
} 
+0

que hice los cambios mencionado por Casey, pero aún no puedo ver ningún material válido dibujado en mi opinión. – Girish

+0

El otro problema es que parece que nunca se agrega 'ImageView' a su' LinearLayout'. Necesita agregar 'layObj.addView (imageView);' al final de 'onCreate()' – CaseyB

+0

He agregado el imageView al diseño lineal, básicamente es un problema con establecer los límites En xml, he codificado el ancho y la altura de la vista de la imagen, ahora está apareciendo, ¿cierto problema con mis setBounds? – Girish

0

Puede que tenga que poner en práctica otras anulaciones como getIntrinsicWidth() y getIntrinsicHeight(). Una forma de saberlo es que establece su layout_width y layout_height en alguna constante (layout_width = "42dip" layout_height = "42dip" en XML o configurando su layoutParams con algún valor si está usando diseños Java). Algunos tipos de vistas no tienen implementado getIntrinsic *, por lo que ¡pruébalos! Esto incluye una vista directa

Puede intentar devolver -1 si no hay ancho o alto específicos.

difícil saber si el problema nunca se resolvió, pero llegué aquí a través de Google tratando de evitarlo recordar los detalles de hacer una Disponibles personalizada, además de que quieren ayudar a las personas a evitar esto: http://xkcd.com/979/

Cuestiones relacionadas