2012-02-27 108 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