android - 带圆角和内阴影的 ImageView

标签 android imageview draw

我需要制作一个带有圆角和内阴影的缩略图 View 。通常我用 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(),同时获得我需要的效果。我设法通过向 Canvas 添加剪切路径来获得圆角矩形,但我找不到添加内部阴影的方法。这是新的 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() 方法中?该框架是否甚至可以调整任何位图的大小,或者是否有另一种方法可以在 Canvas 上绘制缩放图像而不会影响性能?

2) 在 super.onDraw() 到目前为止绘制的内容之上添加内部阴影层,但我对如何做到这一点没有任何想法。

任何帮助将不胜感激。

谢谢!

最佳答案

查看 Eric(来自 squareup)去年 Oreilly 的 AndoridOpen session 上的演讲 Material ,他的演讲标题为 Beautiful Android 它有大量的信息可以帮助你。

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

编辑:感谢@mykola 提供yt link

关于android - 带圆角和内阴影的 ImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469748/

相关文章:

iOS绘图到屏幕

Android:自动选择调试/发布 Maps v2 api key ?

android - Intent 从相机中选择压缩图像或分辨率或尺寸较低的图像

android - 当我需要使用 scaleType 矩阵时如何在 onCreate 中将图像缩放到 imageview

python - 带点线或虚线的 opencv 多边形

java - 如何在 openGL/java 中绘制文本?

java - 将json字符串转换为java对象?

android - 在 RecyclerView 中居中 CardView?

Java正则表达式需要帮助来分割字符串!如何忽略空行?

android - 将可绘制对象放入 xml imageView 时不支持的图像类型