各方面图像的阴影效果

时间:2015-06-17 10:51:59

标签: android android-imageview android-image

我需要为图像创建阴影效果。

private static Bitmap getDropShadow3(Bitmap bitmap) {

if (bitmap==null) return null;
int think = 6;
int w = bitmap.getWidth();
int h = bitmap.getHeight();

int newW = w - (think);
int newH = h - (think);

Bitmap.Config conf = Bitmap.Config.ARGB_8888;
Bitmap bmp = Bitmap.createBitmap(w, h, conf);
Bitmap sbmp = Bitmap.createScaledBitmap(bitmap, newW, newH, false);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas c = new Canvas(bmp);

// Right
Shader rshader = new LinearGradient(newW, 0, w, 0, Color.GRAY, Color.LTGRAY, Shader.TileMode.CLAMP);
paint.setShader(rshader);
c.drawRect(newW, think, w, newH, paint);

// Bottom
Shader bshader = new LinearGradient(0, newH, 0, h, Color.GRAY, Color.LTGRAY, Shader.TileMode.CLAMP);
paint.setShader(bshader);
c.drawRect(think, newH, newW  , h, paint);

//Corner
Shader cchader = new LinearGradient(0, newH, 0, h, Color.LTGRAY,    Color.LTGRAY, Shader.TileMode.CLAMP);
paint.setShader(cchader);
c.drawRect(newW, newH, w  , h, paint);
c.drawBitmap(sbmp, 0, 0, null);
return bmp;
}

我使用了上面的代码,我获得了两面(右,底)阴影效果。我怎样才能在所有方面产生效果,包括(上,左)?

2 个答案:

答案 0 :(得分:0)

您正在使用的方法;可能会导致某些类型的图像(不规则的)出现问题

尝试这种方法(更容易理解和更灵活):

public Bitmap addShadowToBitmap(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;
}

通过以下方式调用:

addShadowToBitmap(arg0, arg1, arg2, arg3, arg4, arg5, arg6);

它会返回bitmap

希望这会有所帮助。

答案 1 :(得分:0)

Ahmad的代码对我来说不太合适。我增加了他的代码,以根据dx / dy和阴影大小确定返回位图的w / h。这段代码为我提供了一个用户签名的位图。

enter image description here


            public Bitmap addShadowToBitmap(final Bitmap bm, int color, int size, int dx, int dy) {

                int dstWidth = bm.getWidth() + dx + size/2;
                int dstHeight = bm.getHeight() + dy + size/2;

                final Bitmap mask = Bitmap.createBitmap(dstWidth, dstHeight, Bitmap.Config.ALPHA_8);

                final Canvas maskCanvas = new Canvas(mask);
                final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
                maskCanvas.drawBitmap(bm, 0, 0, paint);
                paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
                maskCanvas.drawBitmap(bm, dx, dy, paint);

                final BlurMaskFilter filter = new BlurMaskFilter(size, BlurMaskFilter.Blur.NORMAL);
                paint.reset();
                paint.setAntiAlias(true);
                paint.setColor(color);
                paint.setMaskFilter(filter);
                paint.setFilterBitmap(true);

                final Bitmap ret = Bitmap.createBitmap(dstWidth, dstHeight, Bitmap.Config.ARGB_8888);
                final Canvas retCanvas = new Canvas(ret);
                retCanvas.drawBitmap(mask, 0,  0, paint);
                retCanvas.drawBitmap(bm, 0, 0, null);
                mask.recycle();
                return ret;
            }