带有圆角和内部阴影的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)的圆角位图。 结果是我想要的: 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