我需要制作带圆角和内阴影的缩略图。通常我正在制作带有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()绘制到目前为止的内部添加内部阴影层,但我对如何执行此操作的想法不足。
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:11)
去年在Oreilly的AndoridOpen大会上发表题为Beautiful Android的演讲,看看Eric的(来自平方)演讲材料。 它有大量的信息可以帮助你。
我希望他们在某个地方播放他的演示视频。我找不到。很抱歉。
编辑:感谢@mykola的yt link