3

有人可以解释 ImageView 和 com.facebook.drawee.view.SimpleDraweeView 之间的真正区别。为什么 fresco 不使用 imageview。?

我们可以通过 fresco 在服务器上上传图片吗?如果是,请分享代码..

4

3 回答 3

2

与讨论这些类之间“更深”差异的Codo 的回答不同(请参阅此处的图像管道部分),我将讨论可用性差异。


查看源代码SimpleDraweeView相关类可以看到以下继承层次结构:

public class SimpleDraweeView extends GenericDraweeView
public class GenericDraweeView extends DraweeView<GenericDraweeHierarchy>
public class DraweeView<DH extends DraweeHierarchy> extends ImageView

以下描述出现在 的类定义之前DraweeView

虽然ImageView是子类化而不是View直接子类化,但是这个类不支持ImageView'ssetImageXxxsetScaleType类似的方法。扩展ImageView是一种短期解决方案,以便继承其一些实现(填充计算等)。这个类将来很可能被转换为View直接扩展,所以避免使用ImageView's 的方法和属性(T5856175)。

所以我们知道,DraweeView 目前继承自ImageView- 这通常意味着“它可以做所有事情ImageView,甚至更多”(除了上面的评论块中讨论的例外情况)。这种简单的方法可以给你一个大致的想法,但忽略了与 Fresco 兼容性的最重要方面。

Fresco 文档解释了如何使用drawees,你可以从他们的XML定义中看到它们ImageView

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/my_image_view"
    android:layout_width="20dp"
    android:layout_height="20dp"
    fresco:fadeDuration="300"
    fresco:actualImageScaleType="focusCrop"
    fresco:placeholderImage="@color/wait_color"
    fresco:placeholderImageScaleType="fitCenter"
    fresco:failureImage="@drawable/error"
    fresco:failureImageScaleType="centerInside"
    fresco:retryImage="@drawable/retrying"
    fresco:retryImageScaleType="centerCrop"
    fresco:progressBarImage="@drawable/progress_bar"
    fresco:progressBarImageScaleType="centerInside"
    fresco:progressBarAutoRotateInterval="1000"
    fresco:backgroundImage="@color/blue"
    fresco:overlayImage="@drawable/watermark"
    fresco:pressedStateOverlayImage="@color/red"
    fresco:roundAsCircle="false"
    fresco:roundedCornerRadius="1dp"
    fresco:roundTopLeft="true"
    fresco:roundTopRight="false"
    fresco:roundBottomLeft="false"
    fresco:roundBottomRight="true"
    fresco:roundWithOverlayColor="@color/corner_color"
    fresco:roundingBorderWidth="2dp"
    fresco:roundingBorderColor="@color/border_color"
  />

至于上传 - Fresco 似乎只用于下载图像。您可能需要查看Robospice / Retrofit以满足您的上传需求。

于 2016-02-09T10:58:18.893 回答
0

facebook 提供了自己的 ImageView,因此您可以使用他们的 View,而不是创建自己的 CustomView 或 ImageView。

但是,请记住,与您自己的自定义视图相比,您可以对其进行更少的控制。

这为您提供了ButtonView或类似内容的完整包和功能。

像这样的圆角ImageView

       <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/userImage"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp" />
于 2016-02-09T10:30:20.540 回答
0

Android 5 之前的 Android 版本在处理大量图像方面存在严重问题。如果它们在 Java 堆上,Android 2 会出现问题,如果您不销毁 Activity,Android 4 将无法正确释放它们。

因此 Fresco 将图像移动到本机堆(Android 2)并为 Android 4 实现自己的引用计数,以便知道图像何时不再被引用并可以回收。

它们替换ImageViewSimpleDrawView以便完全控制对图像的引用。事实上,只有低级 API 才能让您直接访问图像。否则,他们的引用计数方法将起作用。

于 2016-02-09T10:35:05.980 回答