Как установить размеры DraweeView в wrap_content в библиотеке Fresco

Я использую библиотеку Fresco в своем приложении для загрузки изображений. Проблема в том, что я не могу установить высоту моих изображений на "wrap_content", потому что "wrap_content" не поддерживается в библиотеке Fresco. Итак, как я могу сделать свои изображения красивыми, используя DraweeView? Я посмотрел здесь, но не смог найти решение этой проблемы: frescolib/wrap_content

Например:

<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


person Itiel Maimon    schedule 20.07.2016    source источник


Ответы (2)


Поскольку вы уже знаете точные размеры изображения, вы можете просто рассчитать соотношение сторон вашего изображения, а затем просто установить соотношение сторон в XML или Java. Это работает «из коробки», и вам не нужны какие-либо пользовательские представления или расчеты DP/пикселя, как это предлагается в других ответах.

Для вашего примера это будет 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 в самом низу.

person Alexander Oprisnik    schedule 25.07.2016

Для преобразования 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;
}

Преобразовать пиксель в dp:

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 в качестве измерения. Обходной путь заключается в расширении класса, как ясно указывает приведенный выше ответ.

Используйте формулу, чтобы правильно найти необходимую метрику и программно установить параметры макета для вашего чертежа.

person Kushan    schedule 20.07.2016
comment
Спасибо, выглядит очень хорошо, но что я должен поставить в android:layout_height в файле xml? я не могу оставить его пустым - person Itiel Maimon; 20.07.2016
comment
И как я могу установить высоту draweeview программно? - person Itiel Maimon; 20.07.2016
comment
Я не уверен в настройке размера DraweeView, вместо этого вы можете поместить его в другое представление, скажем, LinearLayout, и использовать его параметры, чтобы установить его высоту и ширину в соответствии с найденными. Держите Drawee равным match_parent, и он будет соответствовать вашим установленным родительским границам, которые должны работать хорошо. - person Kushan; 20.07.2016
comment
см.: stackoverflow.com/questions/6798867/ для установки границ линейного макета. установите его таким образом и сохраните внутренний рисовальщик, чтобы он соответствовал родителю :) - person Kushan; 20.07.2016
comment
Рад помочь :) ну, так как вы приняли другой ответ, это, по крайней мере, заслуживает повышения;) - person Kushan; 20.07.2016
comment
Конечно!!! Я принял другой ответ, потому что считаю, что это лучший способ решить эту проблему для других разработчиков, которые не знают размеров изображений. - person Itiel Maimon; 20.07.2016