Android Paint setShadowLayer() ignores color of its Paint
17,434
You have made your inner bitmap too small and it custs the edges of the rectange. Try this:
Bitmap outerBm = Bitmap.createBitmap(
rect.width(), rect.height(), Bitmap.Config.ARGB_8888);
Bitmap innerBm = Bitmap.createBitmap(
rect.width() + 50, rect.height() + 50, Bitmap.Config.ARGB_8888);
Canvas outerCanvas = new Canvas(outerBm);
Canvas innerCanvas = new Canvas(innerBm);
outerCanvas.rotate(3);
rect.left += 25;
rect.top += 25;
rect.right -= 25;
rect.bottom -= 25;
Paint shadowPaint = new Paint();
shadowPaint.setColor(Color.BLUE);;
shadowPaint.setShadowLayer(12, 12, 12, 0xFF555555);
innerCanvas.drawRect(rect, shadowPaint);
outerCanvas.drawBitmap(innerBm, 0, 0, null);
Author by
Carl Whalley
Linked In profile: http://www.linkedin.com/in/carlwhalley AACD: DD764C12
Updated on July 20, 2022Comments
-
Carl Whalley almost 2 years
I'm trying to create a Bitmap programmatically and am finding drawing a shadowed Rect is ignoring the color arg passed in. I've simplified things down to this case - the code just draws a rotated blue square which is supposed to have a grey shadow, but the shadow is always blue:
main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#fff" android:padding="40dp" > </LinearLayout> RotateRectShadowActivity.java: public class RotateRectShadowActivity extends Activity { private LinearLayout mMainLayout; private ImageView mImageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LayoutInflater factory = LayoutInflater.from( this ); mMainLayout = (LinearLayout) factory.inflate( R.layout.main, null ); mImageView = new ImageView(this); Rect rect = new Rect(0, 0, 300, 300); Bitmap outerBm = Bitmap.createBitmap( rect.width(), rect.height(), Bitmap.Config.ARGB_8888); Bitmap innerBm = Bitmap.createBitmap( rect.width()-50, rect.height()-50, Bitmap.Config.ARGB_8888); Canvas outerCanvas = new Canvas(outerBm); Canvas innerCanvas = new Canvas(innerBm); outerCanvas.rotate(3); rect.left += 25; rect.top += 25; rect.right += 25; rect.bottom += 25; Paint shadowPaint = new Paint(); shadowPaint.setShadowLayer(12, 12, 12, 0xFF555555); shadowPaint.setColor(0xFF555555); innerCanvas.drawRect(rect, shadowPaint); Paint rectPaint = new Paint(); rectPaint.setColor(Color.BLUE); innerCanvas.drawRect(rect, rectPaint); outerCanvas.drawBitmap(innerBm, 0, 0, shadowPaint); mImageView.setImageBitmap(outerBm); mMainLayout.addView(mImageView); setContentView(mMainLayout); } }
I don't see why the call to outerCanvas.drawBitmap(innerBm, 0, 0, shadowPaint); needs a Paint at all, since I'm trying to draw the shadow on the innerBm itself, via innerCanvas, but when I pass null in there's no shadow at all.