Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Facebook Fresco usando wrap_content

Tengo un montón de dibujos que quiero cargar usando fresco, quiero usar wrap_content tamaño para esas imágenes, ¿cómo puedo hacerlo en xml con fresco? ¿O si xml no es posible cómo lo haces en código?

 <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/myImage" android:layout_width="wrap_content" android:layout_height="wrap_content" fresco:placeholderImage="@mipmap/myImage"/> 

El código anterior no funciona a menos que establezca un tamaño fijo.

  • Uso de Fresco de Facebook para cargar un mapa de bits
  • Picasso v / s Imageloader v / s Fresco vs Glide
  • App fallos aleatorios con señal fatal 7 (SIGBUS), código 2 o señal fatal 11 (SIGSEGV), código 1
  • 3 Solutions collect form web for “Facebook Fresco usando wrap_content”

    Soy parte del equipo de Fresco y yo fui el que tomó la decisión de diseño para no apoyar el contenido de envoltura. La justificación se explica en la documentación . Pero en pocas palabras, el problema es que no puede garantizar que la imagen estará disponible inmediatamente (puede que necesite buscarla primero) y eso significa que el tamaño de la vista tendría que cambiar una vez que llegue la imagen. Esto es en la mayoría de los casos no deseable y probablemente debería repensar su interfaz de usuario.

    De todos modos, si realmente realmente necesitas / quieres hacer eso, puedes hacerlo así:

     void updateViewSize(@Nullable ImageInfo imageInfo) { if (imageInfo != null) { draweeView.getLayoutParams().width = imageInfo.getWidth(); draweeView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; draweeView.setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight()); } } ControllerListener listener = new BaseControllerListener { @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); } }; DraweeController controller = draweeControllerBuilder .setUri(uri) .setControllerListener(listener) .build(); draweeView.setController(controller); 

    Escribí este código desde la parte superior de mi cabeza, no lo he probado en realidad. Pero la idea debe ser clara, y debe funcionar con pequeños ajustes.

    Basado en la respuesta de @ plamenko, hice una vista personalizada de la siguiente manera:

     /** * Works when either height or width is set to wrap_content * The view is resized based on the image fetched */ 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()); } } } 

    Puede incluir esta clase en XML , un ejemplo de uso:

     <com.example.ui.views.WrapContentDraweeView android:id="@+id/simple_drawee_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> 

    Encontré una solución extendiendo SimpleDraweeView , me permite usar wrap_content y funciona muy bien. Cómo siempre le setContentView de fijar el tamaño en setContentView y la inspección previo no está trabajando, me alegraría si podría corregir esta respuesta para fijar ésos.

    Uso

     <com.gazman.WrapContentDraweeView android:id="@+id/myImage" android:layout_width="wrap_content" android:layout_height="wrap_content" fresco:placeholderImage="@mipmap/myImage"/> 

    Código fuente

     public class WrapContentDraweeView extends SimpleDraweeView { private int outWidth; private int outHeight; public WrapContentDraweeView(Context context, GenericDraweeHierarchy hierarchy) { super(context, hierarchy); } public WrapContentDraweeView(Context context) { super(context); } public WrapContentDraweeView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context, attrs); } private void init(Context context, AttributeSet attrs) { if (attrs == null) { return; } TypedArray gdhAttrs = context.obtainStyledAttributes( attrs, R.styleable.GenericDraweeView); try { int placeholderId = gdhAttrs.getResourceId( R.styleable.GenericDraweeView_placeholderImage, 0); if(placeholderId != 0){ if(isInEditMode()){ setImageResource(placeholderId); } else { loadSize(placeholderId, context.getResources()); } } } finally { gdhAttrs.recycle(); } } private void loadSize(int placeholderId, Resources resources) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(resources, placeholderId, options); outWidth = options.outWidth; outHeight = options.outHeight; } @Override public void setLayoutParams(ViewGroup.LayoutParams params) { params.width = outWidth; params.height = outHeight; super.setLayoutParams(params); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.