2010-06-03 6 views
11

J'essayais d'obtenir des graphiques 2D sous Android. A titre d'exemple que je veux mettre en œuvre un drawable personnalisé et le montrer dans mon activitéMise en œuvre d'un dessin personnalisable dans Android

J'ai défini une drawable personnalisée en étendant à partir d'Android drawable comme mentionné ci-dessous

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

Je suis en train d'obtenir ce affiché dans mon activité, comme indiqué ci-dessous

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); 

    } 
} 

Mais quand je lance l'application je ne vois pas rectangle sur l'activité, quelqu'un peut me aider? Où vais-je mal?

Répondre

11

Votre problème est dans la méthode getOpacity(). 100 n'est pas une valeur valide. Vous devez utiliser une valeur PixelFormat. En outre, vous devez créer votre RectF et Paint dans le constructeur, puis ajuster simplement les valeurs dans draw() afin de ne pas créer autant d'objets qui ont besoin d'être collectés. Comme ceci:

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

J'ai fait les changements mentionné par Casey, mais je ne suis toujours pas en mesure de voir des choses valables dessinées sur mon point de vue. – Girish

+0

Un autre problème est qu'il semble que vous n'ajoutez jamais le 'ImageView' à votre' LinearLayout'. Vous devez ajouter 'layObj.addView (imageView);' à la fin de 'onCreate()' – CaseyB

+0

J'ai ajouté l'imageView à la disposition linéaire, c'est fondamentalement un problème avec les limites en xml, j'ai codé en dur la largeur et la hauteur de la vue de l'image, maintenant il apparaît, donc un problème avec mon setBounds est-il? – Girish

0

Vous devrez peut-être implémenter d'autres remplacements comme getIntrinsicWidth() et getIntrinsicHeight(). Une façon de le dire est que vous définissez votre layout_width et layout_height à une certaine constante (layout_width = "42dip" layout_height = "42dip" en XML ou en définissant votre layoutParams à une certaine valeur si vous utilisez des mises en page Java). Certains types de vue ne gèrent pas getIntrinsic *, alors essayez-les! Cela inclut une vue directe

Vous pouvez essayer de retourner -1 s'il n'y a pas de largeur ou de hauteur spécifique.

Difficile à dire si le problème jamais eu résolu, mais je suis arrivé ici par Google en essayant de me aider à se rappeler les détails de faire une Drawable personnalisée, plus je veux aider les gens à éviter ceci: http://xkcd.com/979/