2014-02-11 2 views
2

У меня есть два изображения, которые не всегда полностью вписываются в экран. Поэтому я хочу их обрезать (например, CENTER_CROP), но так, чтобы нижняя область изображения всегда была видимой. Оба изображения заполняют всю ширину экрана и каждую 1/2 высоты экрана.ImageView Scaling 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 (с)).

Для BOTTOM_CROP я думал, что я хотел бы использовать:

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

Но это на самом деле не работает, для первого изображения в нижней части отображается более или менее правильно, но есть какая-то маржа ниже него - нижняя граница изображения должна быть точно в нижней части рамки ImageView. Я предполагаю, что я должен каким-то образом использовать прокладку, но я не знаю, как измерить «новую» высоту изображения после того, как установлено значение горизонтального заполнения.

Однако большая проблема заключается в том, что (по какой-либо причине), когда я устанавливаю значение py в setScale(), второй 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; 
} 

Надеюсь, это поможет!