Facebook Fresco使用wrap_content

Ily*_*man 15 android facebook fresco

我有一堆drawables,我想用壁画加载,我想使用wrap_content这些图像的大小,我怎么能在壁画的xml中做到这一点?或者,如果不可能使用xml,您如何在代码中执行此操作?

<com.facebook.drawee.view.SimpleDraweeView
          android:id="@+id/myImage"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          fresco:placeholderImage="@mipmap/myImage"/>
Run Code Online (Sandbox Code Playgroud)

除非我设置固定大小,否则上述代码无效.

pla*_*nko 34

我是Fresco团队的一员,我做出了不支持包装内容的设计决策.理由在文档中解释.但简而言之,问题在于您不能保证图像立即可用(您可能需要先获取它),这意味着一旦图像到达,视图大小就必须改变.这在大多数情况下是不可取的,您应该重新考虑您的UI.

无论如何,如果你真的需要/想要这样做,你可以这样做:

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);
Run Code Online (Sandbox Code Playgroud)

我从头顶编写了这段代码,我还没有真正测试过.但这个想法应该是清楚的,它应该适用于微小的调整.

  • Tnx 为您解答。无论包装内容支持如何,我建议您重新考虑您的决定。在许多情况下,人们使用可绘制资源,这些资源适用于静态图像或某些动画。每个应用程序都以某种方式获得其中一些。很高兴知道弗拉斯科会消除我对记忆的恐惧。如果有帮助,您可以将其命名为 StaticDrawee。 (2认同)

ved*_*ant 25

根据@ plamenko的回答,我做了如下自定义视图:

/**
 * 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在XML示例用法中包含此类:

<com.example.ui.views.WrapContentDraweeView
    android:id="@+id/simple_drawee_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />
Run Code Online (Sandbox Code Playgroud)