Dibujar una sombra exterior al dibujar una imagen

Actualmente, creo una versión redondeada de una imagen en mi aplicación dibujando en un canvas. Me gustaría dibujar una ligera sombra de sombras alrededor de la imagen, pero no puedo hacerlo bien. Tengo 2 preguntas: 1. ¿Cómo puedo dibujar una sombra exterior (solo puedo dibujar una sombra con el eje ax o y)? 2. ¿Cómo puedo dibujar la sombra para que no tenga los artefactos que se muestran en la imagen adjunta? . Código:

![public Bitmap getRoundedCornerBitmap(Bitmap bitmap, float cornerRadius) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth()+6, bitmap.getHeight() +6, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; int shadowRadius = getDipsFromPixel(3); final Rect imageRect = new Rect(shadowRadius, shadowRadius, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(imageRect); // This does not achieve the desired effect Paint shadowPaint = new Paint(); shadowPaint.setAntiAlias(true); shadowPaint.setColor(Color.BLACK); shadowPaint.setShadowLayer((float)shadowRadius, 2.0f, 2.0f,Color.BLACK); canvas.drawOval(rectF, shadowPaint); canvas.drawARGB(0, 0, 0, 0); final Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(color); canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, imageRect, imageRect, paint); return output; }][1] 

http://i.stack.imgur.com/d7DV6.png

Este es un ejemplo del efecto que bash lograr: enter image description here

    Aquí vamos

    http://i.imgur.com/cKi1ckX.png Sí, todavía excavo el Nexus S

    Antes que nada, por favor, dejen de enmascarar mapas de bits de esa manera, pueden lograr esto sin asignar otro Bitmap , revisen esta publicación de blog sobre cómo dibujar imágenes redondeadas (y en realidad cualquier forma) .

    Drawable usar ese Drawable probablemente puedas descubrir cómo agregar tu sombra, solo asegúrate de que no quede recortada, en 18+ podrías usar ViewOverlay para eso, también ViewOverlay en cuenta que hay varias operaciones de dibujo no compatibles para capas aceleradas por hardware. , que incluye setShadowLayer y BlurMaskFilter , si el rendimiento no es un problema para usted, puede desactivarlo como siempre:

     if (SDK_INT >= HONEYCOMB) { view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } 

    Y use setShadowLayer como ya lo estaba intentando:

     somePaint.setShadowLayer(shadowSize, deltaX, deltaY, shadowColor); 

    Para una muestra, verifique el enlace al final.

    Si aún desea tener hardware acelerado, deberá falsificarlo con el riesgo de sobreribujo, puede usar un degradado radial o dibujar otro óvalo borrándolo usted mismo (como se mencionó anteriormente no puede usar BlurMaskFilter ) o usar un Bitmap previamente borroso ( más enmascaramiento).

    Para una sombra tan sutil, preferiría simplemente ir plana si se requiere rendimiento, la salsa completa está en el banano .

    Actualización: Comenzando L puedes usar sombras reales .

    Quería un efecto similar, pero en un AppWidget, lamentablemente no pude usar la solución de @EvelioTarazona. Esto es lo que se me ocurrió, debería funcionar con un bitmap de cualquier forma.

      final Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); final Bitmap shadow = addShadow(src, src.getHeight(), src.getWidth(), Color.BLACK, 3, 1, 3); final ImageView iv = (ImageView)findViewById(R.id.image); iv.setImageBitmap(shadow); 

    Ejemplo con parámetros size = 3, dx = 1, dy = 3, color = NEGRO

      public Bitmap addShadow(final Bitmap bm, final int dstHeight, final int dstWidth, int color, int size, float dx, float dy) { final Bitmap mask = Bitmap.createBitmap(dstWidth, dstHeight, Config.ALPHA_8); final Matrix scaleToFit = new Matrix(); final RectF src = new RectF(0, 0, bm.getWidth(), bm.getHeight()); final RectF dst = new RectF(0, 0, dstWidth - dx, dstHeight - dy); scaleToFit.setRectToRect(src, dst, ScaleToFit.CENTER); final Matrix dropShadow = new Matrix(scaleToFit); dropShadow.postTranslate(dx, dy); final Canvas maskCanvas = new Canvas(mask); final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); maskCanvas.drawBitmap(bm, scaleToFit, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); maskCanvas.drawBitmap(bm, dropShadow, paint); final BlurMaskFilter filter = new BlurMaskFilter(size, Blur.NORMAL); paint.reset(); paint.setAntiAlias(true); paint.setColor(color); paint.setMaskFilter(filter); paint.setFilterBitmap(true); final Bitmap ret = Bitmap.createBitmap(dstWidth, dstHeight, Config.ARGB_8888); final Canvas retCanvas = new Canvas(ret); retCanvas.drawBitmap(mask, 0, 0, paint); retCanvas.drawBitmap(bm, scaleToFit, null); mask.recycle(); return ret; } 

    Crea un nombre xml en round_shape.xml en una carpeta dibujable

     < ?xml version="1.0" encoding="utf-8"?>    

    Establezca este round_shape como fondo de la vista de la imagen como a continuación

      

    El código anterior crea una capa delgada alrededor de la vista de imagen después de haber redondeado el bitmap, la función siguiente hará esto

     public Bitmap roundBit(Bitmap bm) { Bitmap circleBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888); BitmapShader shader = new BitmapShader(bm, TileMode.CLAMP, TileMode.CLAMP); Paint paint = new Paint(); paint.setShader(shader); paint.setAntiAlias(true); Canvas c = new Canvas(circleBitmap); c.drawCircle(bm.getWidth() / 2, bm.getHeight() / 2, bm.getWidth() / 2, paint); return circleBitmap; } 

    enter image description here

      ImageView imageView=findViewById(R.id.iv); Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.images); imageView.setImageBitmap(doHighlightImage(icon)); public static Bitmap doHighlightImage(Bitmap src) { Bitmap bmOut = Bitmap.createBitmap(src.getWidth() + 96, src.getHeight() + 96, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmOut); canvas.drawColor(0, Mode.CLEAR); Paint ptBlur = new Paint(); ptBlur.setMaskFilter(new BlurMaskFilter(15, BlurMaskFilter.Blur.NORMAL)); int[] offsetXY = new int[2]; Bitmap bmAlpha = src.extractAlpha(ptBlur, offsetXY); Paint ptAlphaColor = new Paint(); ptAlphaColor.setColor(Color.BLACK); canvas.drawBitmap(bmAlpha, offsetXY[0], offsetXY[1], ptAlphaColor); bmAlpha.recycle(); canvas.drawBitmap(src, 0, 0, null); return bmOut; }