2014-02-11 110 views
2

我有兩個圖像並不總是完全適合屏幕。因此我想裁剪它們(像CENTER_CROP那樣),但是以某種方式使圖像的底部區域始終可見。兩張圖像都填充整個屏幕寬度和屏幕高度的每個1/2。ImageView縮放BOTTOM_CROP

我發現了一個類似的解決方案在這裏: ImageView scaling TOP_CROP 接受的解決方案完美地工作,但我無法弄清楚如何改變矩陣,使其BOTTOM_CROP代替。

工作代碼TOP_CROP:

setScaleType(ScaleType.MATRIX); 
Matrix matrix = getImageMatrix(); 
float scaleFactor = (getWidth() - Data.getImgPadding(c))/(float) getDrawable().getIntrinsicWidth(); 
matrix.setScale(scaleFactor, scaleFactor, 0, 0); 
setImageMatrix(matrix); 

注:填充到正確的設置編程,因此它需要被包括在計算中(該值由Data.getImgPadding(c)中讀出)。

對於BOTTOM_CROP我想我會用:

matrix.setScale(scaleFactor, scaleFactor, 0, getHeight()); 

但它不是真正的工作,第一個圖像顯示或多或少正確的底部,但有某種下方緣 - 底部圖像邊框應該完全位於ImageView邊框的底部。我假設我不得不使用填充,但我不知道如何在水平填充值設置後計算「新」圖像高度。

然而,更大的問題是(無論什麼原因),當我在setScale()中設置py值時,第二個ImageView突然變空了......兩個視圖都使用相同的佈局xml,但這不可能是原因因爲原始代碼在兩者上都能很好地工作。

回答

1

我知道這已經很久沒有了,但我已經修改了帖子中的答案以滿足您的需求。

@Override 
protected boolean setFrame(int l, int t, int r, int b) { 
    boolean hasChanged = super.setFrame(l, t, r, b); 
    Matrix matrix = getImageMatrix(); 
    float scaleFactor = getWidth()/(float) getDrawable().getIntrinsicWidth(); 
    matrix.setScale(scaleFactor, scaleFactor, 0, 0); 

    // The Important Bit 
    Drawable drawable = getDrawable(); 
    float heightD = drawable.getIntrinsicHeight(); 
    float height = getHeight(); 
    matrix.setTranslate(0, height - heightD); 

    setImageMatrix(matrix); 
    return hasChanged; 
} 

希望它有幫助!