Как установить размеры 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"
    />

Примечание: убедитесь, что вы применили имя вашего пакета. В противном случае это не работает.

Другие вопросы по тегам