带有圆角和内部阴影的ImageView

我需要制作一个带有圆角和内部阴影的缩略图。 通常,我使用9个图片制作ImageView帧,这些帧已经很好地服务了我,但是这次我需要的效果需要在图像顶部绘制内部阴影(而不仅仅是围绕它)。 这导致我扩展ImageView类并重写onDraw()方法。

public class ThumbnailImageView extends ImageView {

在许多教程(谢谢StackOverflow!)后,我最终得到了onDraw()方法的代码:

@Override
protected void onDraw(Canvas canvas) {
    if (mBitmap == null) {
        return;
    }

    int radius = 4;
    int padding = 2;
    int bleed = 2;
    RectF frame = new RectF(padding, padding, getWidth() - padding, getHeight() - padding);

    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setColor(0xFF000000);
    canvas.drawRoundRect(frame, radius, radius, mPaint);

    Shader bitmapShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);
    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setColor(0xFF000000);
    mPaint.setMaskFilter(new BlurMaskFilter(bleed, Blur.INNER));
    mPaint.setShader(bitmapShader);
    canvas.drawRoundRect(frame, radius, radius, mPaint);
}

我基本上做的是先绘制一个黑色的圆角矩形,然后在其上绘制一个带有渐变边缘(使用BlurMaskFilter)的圆角位图。 结果是我想要的: onDraw()结果 mBitmap值在ImageView构造函数中初始化,如下所示:

mDrawable = getDrawable();
if (mDrawable != null) {
    mBitmap = ((BitmapDrawable) mDrawable).getBitmap();
}

问题是我完全覆盖了onDraw()(没有super.onDraw())被调用,所以我必须将所有图像预先缩放到所需的缩略图大小(例如96x96),否则只有图像的左上角图像被绘制。 我希望能够做的是利用框架在将下列xml值分配给ThumbnailImageView时进行的所有缩放:

android:id="@+id/thumb"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"

要做到这一点,我想我应该以某种方式调用super.onDraw(),同时获得我需要的效果。 我设法通过向画布添加剪切路径来获得圆角矩形,但我无法找到添加内部阴影的方法。 这是新的onDraw()代码:

@Override
protected void onDraw(Canvas canvas) {
    int radius = 4;
    int padding = 4;        
    RectF frame = new RectF(padding, padding, getWidth() - padding, getHeight() - padding);
    Path clipPath = new Path();
    clipPath.addRoundRect(frame, radius, radius, Path.Direction.CW);
    canvas.clipPath(clipPath);
    super.onDraw(canvas);
    // add inner shadow
}

我可以看到两种选择:

1)正确预缩放ImageView的位图。 但是,最好的地方在哪里呢? 在它的构造函数? 在框架似乎在做的onDraw()方法? 该框架是否调整了任何位图的大小,还是有另一种方法在画布上绘制缩放图像而不会影响性能?

2)在super.onDraw()正在绘制的东西的顶部添加内部阴影图层,但我已经没有了解如何执行此操作的想法。

任何帮助,将不胜感激。

谢谢!


去年,他在Oreilly的AndoridOpen Conference上发表了Eric的演讲材料,名为“漂亮的Android”。它有很多信息可以帮助你。

我希望他们有他的演讲视频。 我找不到。 非常抱歉。

编辑:感谢@mykola yt链接

链接地址: http://www.djcxy.com/p/31449.html

上一篇: ImageView with rounded corners and inner shadow

下一篇: Threading UI updates in Android