2012-02-27 104 views
17

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

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()所绘制的内容上添加内部阴影图层,但是我已经没有想法了解如何做到这一点。

任何帮助,将不胜感激。

谢谢!

回答

11

去年在Oreilly的AndoridOpen会议上发表的题为Beautiful Android 的Eric的演讲材料看起来有很多信息可以帮助你。

我希望他们有他的介绍视频的地方。我找不到。非常抱歉。

编辑:感谢@mykola为yt link

+1

+1的一个非常有用的链接:) – Wesley 2012-07-04 10:37:24

+1

这里是链接到视频http://www.youtube.com/watch?v=jF6Ad4GYjRU – mykola 2012-09-30 11:09:51

+0

@mykola OMG。你摇滚。感谢您的链接! – petey 2012-10-01 13:46:47