有人可以解释 ImageView 和 com.facebook.drawee.view.SimpleDraweeView 之间的真正区别。为什么 fresco 不使用 imageview。?
我们可以通过 fresco 在服务器上上传图片吗?如果是,请分享代码..
与讨论这些类之间“更深”差异的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
'ssetImageXxx
和setScaleType
类似的方法。扩展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以满足您的上传需求。
facebook 提供了自己的 ImageView,因此您可以使用他们的 View,而不是创建自己的 CustomView 或 ImageView。
但是,请记住,与您自己的自定义视图相比,您可以对其进行更少的控制。
这为您提供了Button、View或类似内容的完整包和功能。
像这样的圆角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" />
Android 5 之前的 Android 版本在处理大量图像方面存在严重问题。如果它们在 Java 堆上,Android 2 会出现问题,如果您不销毁 Activity,Android 4 将无法正确释放它们。
因此 Fresco 将图像移动到本机堆(Android 2)并为 Android 4 实现自己的引用计数,以便知道图像何时不再被引用并可以回收。
它们替换ImageView
为SimpleDrawView
以便完全控制对图像的引用。事实上,只有低级 API 才能让您直接访问图像。否则,他们的引用计数方法将起作用。