Как установить размеры DraweeView в "wrap_content" в библиотеке Fresco
Я использую Fresco
библиотека в моем приложении для загрузки изображений. Проблема в том, что я не могу установить высоту своих изображений в "wrap_content"
так как "wrap_content"
не поддерживается в Fresco
библиотека. Итак, как я могу сделать мои изображения хорошо выглядеть, используя DraweeView
? Я посмотрел здесь, но я не смог найти решение этой проблемы: http://frescolib.org/docs/wrap-content.html
Например:
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/intro_image1"
android:layout_width="match_parent"
android:layout_height= // Can't use "wrap_content"
fresco:placeholderImage="@drawable/placeholder_image" />
Кстати, размеры изображения 730*760
2 ответа
Поскольку вы уже знаете точные размеры изображения, вы можете просто рассчитать соотношение сторон вашего изображения, а затем просто установить соотношение сторон в XML или Java. Это работает "из коробки", и вам не нужны никакие пользовательские представления или расчеты DP / pixel, как предложено в других ответах.
Для вашего примера это будет w/h = 730/760 = 0,96052631578
Теперь вы можете просто установить его: в XML:
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="match_parent" <!-- or the desired width -->
android:layout_height="wrap_content"
fresco:viewAspectRatio="0.96052631578" <!-- your aspect ratio -->
<!-- other attributes -->
Или на Java:
mSimpleDraweeView.setAspectRatio(0.96052631578f); // or whatever your aspect ratio is
Смотрите также http://frescolib.org/docs/using-drawees-xml.html в самом низу.
Для dp в px и px в dp на всех устройствах используйте следующую формулу:
Convert dp to pixel:
public int dpToPx(int dp) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return px;
}
Преобразовать пиксель в дп:
public int pxToDp(int px) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return dp;
}
SimpleDraweeView напрямую не разрешает использование wrap_content в качестве измерения. Обходной путь состоит в том, чтобы расширить класс, как ясно показывает ответ выше.
Используйте формулу, чтобы правильно найти нужный показатель и программно установить параметры макета для вашего просмотра.
Вы можете создать Custom
вид расширяется SimpleDraweeView
как ниже путь
public class WrapContentDraweeView extends SimpleDraweeView {
// we set a listener and update the view's aspect ratio depending on the loaded image
private final ControllerListener listener = new BaseControllerListener<ImageInfo>() {
@Override
public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
updateViewSize(imageInfo);
}
@Override
public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable animatable) {
updateViewSize(imageInfo);
}
};
public WrapContentDraweeView(Context context, GenericDraweeHierarchy hierarchy) {
super(context, hierarchy);
}
public WrapContentDraweeView(Context context) {
super(context);
}
public WrapContentDraweeView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setImageURI(Uri uri, Object callerContext) {
DraweeController controller = ((PipelineDraweeControllerBuilder)getControllerBuilder())
.setControllerListener(listener)
.setCallerContext(callerContext)
.setUri(uri)
.setOldController(getController())
.build();
setController(controller);
}
void updateViewSize(@Nullable ImageInfo imageInfo) {
if (imageInfo != null) {
setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight());
}
}
}
а затем использовать этот способ
<com.example.ui.views.WrapContentDraweeView
android:id="@+id/simple_drawee_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
Примечание: убедитесь, что вы применили имя вашего пакета. В противном случае это не работает.