2014-01-13 67 views
1

我在這裏和其他互聯網上仔細搜索過,但沒有找到解決方案。 我有固定大小的ImageView。我需要顯示一些位圖,在運行時加載。它們都有不同的尺寸和長寬比。例如:ImageView是480x270px的位圖可以是160x90,1600x500,50x100等等。我希望它們能夠集中在ImageView中並適合它們。圓角。帶有圓角的Android ImageView(再次)

兩種最流行的方法是(1)處理位圖和(2)修改imageView子類中的繪製階段。

Romain Guy擴展Drawable並在Canvas中使用drawRoundRect方法。不幸的是,他的解決方案不適用FIT_CENTER,儘管圓角線很銳利。

還有一種處理位圖的方式,將其渲染到另一個位圖並四捨五入。將它設置爲源 - 獲取中心和適合的ImageView。但是在這種情況下,舍入矩形僅在位圖的像素網格中存在。如果位圖很小,可能會非常模糊。

最後一個解決方案,最適合我,但也需要升級。我們可以調整畫布以沿其邊框包含clipPath。但是具有16/5縱橫比的居中位圖不會被四捨五入 - 它將被繪製在cliPath之外。

回答

3

所以,我完成了here的回答,所以它可以解決我的問題。

XML:

<RoundedThumb 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

JAVA:

public class RoundedThumb extends ImageView { 

private final float radius = getContext().getResources().getDimension(R.dimen.corner_radius); 
private RectF mSrcRect = new RectF(); 
private RectF mDstRect = new RectF(); 
private Path mClipPath = new Path(); 

public RoundedThumb(Context context) { 
    super(context); 
} 

public RoundedThumb(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public RoundedThumb(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

protected void onDraw(Canvas canvas) { 
    if (getDrawable() != null && getImageMatrix() != null) { 
     mSrcRect.set(0, 0, getDrawable().getIntrinsicWidth(), getDrawable().getIntrinsicHeight()); 
     getImageMatrix().mapRect(mDstRect, mSrcRect); 
     mClipPath.reset(); 
     mClipPath.addRoundRect(mDstRect, radius, radius, Path.Direction.CW); 
     canvas.clipPath(mClipPath); 
    } 
    super.onDraw(canvas); 
} 
} 

與用法:

thumb.setScaleType(ImageView.ScaleType.FIT_CENTER); 
Bitmap thumbnail = BitmapFactory.decodeFile(path); 
thumb.setImageBitmap(thumbnail); 

所以,現在矩形的路徑轉化就像BitmapDrawable內的ImageView,始終準確地周圍包圍ImageView中的任何位圖。對我來說重要的是 - ImageView仍然具有aspectRatio 16/9,並在資源中定義它的位置。但是位圖有四捨五入的邊框,但沒有修改。

UPD1:我有點困惑:不幸的是在某些設備上clipPath方法沒有效果(SII)甚至崩潰(舊的華碩變壓器)。可以通過將hardwareAccelerated設置爲false來完全修復。但是,該死的,這是不好的=/

+0

與hardwareAccelerated真相同:( – Marabita

+0

最後我從資源中刪除hardwareAccelerated,只是放在try/catch onDraw。 – mjollneer