带有圆角和内部阴影的ImageView

时间:2012-02-27 17:54:27

标签: android imageview draw

我需要制作带圆角和内阴影的缩略图。通常我正在制作带有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() result 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()绘制到目前为止的内部添加内部阴影层,但我对如何执行此操作的想法不足。

任何帮助都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:11)

去年在Oreilly的AndoridOpen大会上发表题为Beautiful Android的演讲,看看Eric的(来自平方)演讲材料。 它有大量的信息可以帮助你。

我希望他们在某个地方播放他的演示视频。我找不到。很抱歉。

编辑:感谢@mykola的yt link

相关问题