Programmatically create ShapeDrawable

I am trying to programmatically create a ShapeDrawable, but the following code shows nothing.

ImageView image = new ImageView (context); image.setLayoutParams (new LayoutParams (200, 200)); ShapeDrawable badge = new ShapeDrawable (new OvalShape()); badge.setBounds (0, 0, 200, 200); badge.getPaint().setColor(Color.RED); ImageView image = new ImageView (context); image.setImageDrawable (badge); addView (image); 

I can make it work with xml.

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="200px" android:height="200px" /> <solid android:color="#F00" /> </shape> ImageView image = new ImageView (context); image.setLayoutParams (new LayoutParams (200, 200)); image.setImageResource (R.drawable.badge); addView (image); 

But I would like to create it programmatically. Xml works fine, so the problem cannot be with ImageView, it should be in creating ShapeDrawable.

+6
source share
2 answers

Use setIntrinsicWidth and setIntrinsicHeight instead of setBounds to set the width and height.

 ImageView image = new ImageView (context); image.setLayoutParams (new LayoutParams (200, 200)); ShapeDrawable badge = new ShapeDrawable (new OvalShape()); badge.setIntrinsicWidth (200); badge.setIntrinsicHeight (200); badge.getPaint().setColor(Color.RED); image.setImageDrawable (badge); addView (image); 
+6
source

You may need to create a class that extends ShapeDrawable to override onDraw and then instantiate your class.

Example: ( Source - check the link for a full example)

 private static class MyShapeDrawable extends ShapeDrawable { private Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); public MyShapeDrawable(Shape s) { super(s); mStrokePaint.setStyle(Paint.Style.STROKE); } public Paint getStrokePaint() { return mStrokePaint; } @Override protected void onDraw(Shape s, Canvas c, Paint p) { s.draw(c, p); s.draw(c, mStrokePaint); } } 
0
source

All Articles