【转】Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]

Fresco简单的使用—SimpleDraweeView

  • 百学须先立志—学前须知:

    在我们平时加载图片(不管是下载还是加载本地图片…..)的时候,我们经常会遇到这样一个需求,那就是当图片正在加载时应该呈现正在加载时的图像,当图片加载失败时应该呈现图片加载时的图像,当我们重新加载这张图片时,应该呈现重试时图像,直到这张图片加载完成。这些繁琐并且重复的如果得不到简化的话,那将是一个开发人员的噩梦,现在好了,我们用 Facebook 出品的一个强大的图片加载组件 Fresco 几行代码就可以搞定以上问题了。

  • 尽信书,不如无书—能学到什么?

    1、SimpleDraweeView最基本的使用 
    2、SimpleDraweeView的圆形图 
    3、SimpleDraweeView的圆角图 
    4、SimpleDraweeView的缩放类型

  • 工欲善其事必先利其器—下载Fresco并导入到项目

    Fresco中文说明:http://www.fresco-cn.org/

    Fresco项目GitHub地址:https://github.com/facebook/fresco

    第一步进入 Fresco项目GitHub地址 :

    第一步

    第二步添加Fresco到项目工程:

    使用说明

    第三步服务及权限:

    <!-- 访问网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    • 1
    • 2
    • 1
    • 2

    服务及权限

  • 常见问题:

    初次使用,我们就先简单书写我们的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_adv" android:layout_width="300dp" android:layout_height="300dp" android:layout_centerInParent="true" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    代码分析:

    初次加载

    MainActivity 实现代码:

    public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    简单的书写完布局和实现代码之后我们来运行一下。

            java.lang.RuntimeException: Unable to start activity ComponentInfo{scp.com.frescodemo/scp.com.frescodemo.MainActivity}: android.view.InflateException: Binary XML file line #5: Error inflating class com.facebook.drawee.view.SimpleDraweeView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2264) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2313) at android.app.ActivityThread.access$1100(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5336) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class com.facebook.drawee.view.SimpleDraweeView
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    报错

    运行报错了!怎么回事呢?这里啊,是因为我们没有在应用调用 setContentView() 之前进行初始化Fresco造成的;解决办法:

    修改我们的 MainActivity 里代码:

    public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fresco.initialize(this); setContentView(R.layout.activity_main); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    解决办法

    再运行就没有错误发生了。

  • 占位图—placeholderImage:

    在此之前我们需要一张占位图 icon_placeholder.png 大家右键另存为即可:

    icon_placeholder

    修改我们的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_adv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    代码说明:

    占位符

    MainActivity 无需修改,运行一下:

    占位符

  • 正在加载图—progressBarImage:

    在此之前我们需要一张正在加载图 icon_progress_bar.png 大家右键另存为即可:

    正在加载图

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    代码说明:

    正在加载图

    更改我们的 MainActivity 里代码:

    public class MainActivity extends AppCompatActivity { private SimpleDraweeView simpleDraweeView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fresco.initialize(this); setContentView(R.layout.activity_main); initView(); } private void initView() { //创建SimpleDraweeView对象 simpleDraweeView = (SimpleDraweeView) findViewById(R.id.main_sdv); //创建将要下载的图片的URI Uri imageUri = Uri.parse("https://img-my.csdn.net/uploads/avatar/4/E/8/1_y1scp.jpg"); //开始下载 simpleDraweeView.setImageURI(imageUri); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    代码分析:

    正在加载图

    运行效果图:

    正在加载图

    正在加载图本身是不可以转的,但是呢,加上了 fresco:progressBarAutoRotateInterval="5000" 属性,那么它就可以旋转了;可以看到,正在加载图一闪而过,这是因为我们加载的图片很小,网络也很好。

  • 失败图—failureImage:

    在此之前我们需要一张正在加载图 icon_failure.png 大家右键另存为即可:

    icon_failure

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="centerInside" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    代码分析:

    失败图代码分析

    修改我们的 MainActivity 里代码:

    public class MainActivity extends AppCompatActivity { private SimpleDraweeView simpleDraweeView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fresco.initialize(this); setContentView(R.layout.activity_main); initView(); } private void initView() { //创建SimpleDraweeView对象 simpleDraweeView = (SimpleDraweeView) findViewById(R.id.main_sdv); //创建将要下载的图片的URI Uri imageUri = Uri.parse("https://img-my.csdn.net/uploads/avatar_y1scp.jpg"); //开始下载 simpleDraweeView.setImageURI(imageUri); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    代码说明:

    错误的网络图片地址

    运行效果:

    failure

  • 重试图—retryImage:

    在此之前我们需要一张正在加载图 icon_retry.png 大家右键另存为即可:

    icon_retry

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="centerInside" fresco:retryImage="@mipmap/icon_retry" fresco:retryImageScaleType="centerCrop" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    代码分析:

    重试图

    修改我们的 MainActivity 里代码:

    public class MainActivity extends AppCompatActivity { private SimpleDraweeView simpleDraweeView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fresco.initialize(this); setContentView(R.layout.activity_main); initView(); } private void initView() { //创建SimpleDraweeView对象 simpleDraweeView = (SimpleDraweeView) findViewById(R.id.main_sdv); //创建将要下载的图片的URI Uri imageUri = Uri.parse("https://img-my.csdn.net/uploads/avatar_y1scp.jpg"); //开始下载 simpleDraweeView.setImageURI(imageUri); //创建DraweeController DraweeController controller = Fresco.newDraweeControllerBuilder() //加载的图片URI地址 .setUri(imageUri) //设置点击重试是否开启 .setTapToRetryEnabled(true) //设置旧的Controller .setOldController(simpleDraweeView.getController()) //构建 .build(); //设置DraweeController simpleDraweeView.setController(controller); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    代码说明:

    重试图片

    运行效果:

    重试图效果

    注意:

    重复加载4次还是没有加载出来的时候才会显示 failureImage(失败图) 的图片

  • 淡入淡出动画—fadeDuration:

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="centerInside" fresco:retryImage="@mipmap/icon_retry" fresco:retryImageScaleType="centerCrop" fresco:fadeDuration="5000" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    代码说明:

    淡入淡出动画

    MainActivity 中的代码无需修改。

    运行效果:

    重试+进度图+失败图进度图+正确图
    淡入淡出动画正确图
  • 背景图—backgroundImage:

    这里呢,我们的背景图采用的是一个系统所提供的颜色中的一种。

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:fadeDuration="5000" fresco:backgroundImage="@android:color/holo_orange_light" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    代码说明:

    背景图

    MainActivity 中的代码无需修改,运行效果:

    背景效果

  • 叠加图—overlayImage:

    这里呢,我们的背景图采用的是一个系统所提供的颜色中的一种。

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="centerInside" fresco:retryImage="@mipmap/icon_retry" fresco:retryImageScaleType="centerCrop" fresco:fadeDuration="5000" fresco:backgroundImage="@android:color/holo_orange_light" fresco:pressedStateOverlayImage="@android:color/holo_green_dark" fresco:overlayImage="@android:color/black" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    代码说明:

    叠加图

    MainActivity 中的代码无需修改。

    运行效果:

    叠加图

    从运行效果来看,叠加图在最上面,覆盖了下面的图。

  • 圆形图—roundAsCircle:

    一行代码搞定圆形图:设置roundAsCircle为true;

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="centerInside" fresco:retryImage="@mipmap/icon_retry" fresco:retryImageScaleType="centerCrop" fresco:fadeDuration="5000" fresco:backgroundImage="@android:color/holo_orange_light" fresco:roundAsCircle="true" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    代码说明:

    圆形图

    MainActivity 中的代码无需修改。

    运行效果:

    circle

    可以看到,从图片开始加载一直到图片下载完毕,整个图像都是圆形的。

  • 圆角图—roundedCornerRadius:

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="centerInside" fresco:retryImage="@mipmap/icon_retry" fresco:retryImageScaleType="centerCrop" fresco:fadeDuration="5000" fresco:backgroundImage="@android:color/holo_orange_light" fresco:roundedCornerRadius="30dp" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    代码说明:

    圆角

    MainActivity 中的代码无需修改。

    运行效果:

    圆角运行图

    可以看到,从图片开始加载一直到图片下载完毕,整个图像都是圆角的。

    圆角属性圆角属性
    左上角是否为圆角fresco:roundTopLeft="false"右上角是否为圆角fresco:roundTopRight="false"
    topLefttopRight
    bottomLeftbottomRight
    左下角是否为圆角fresco:roundBottomLeft="false"右下角是否为圆角fresco:roundBottomRight="false"

    注意:

    当我们同时设置图像显示为圆形图像和圆角图像时,只会显示为圆形图像。

    同时设置圆形圆角

  • 圆形圆角边框宽度及颜色—roundingBorder:

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="focusCrop" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="focusCrop" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="focusCrop" fresco:retryImage="@mipmap/icon_retry" fresco:retryImageScaleType="focusCrop" fresco:fadeDuration="5000" fresco:backgroundImage="@android:color/holo_orange_light" fresco:roundAsCircle="true" fresco:roundedCornerRadius="30dp" fresco:roundTopLeft="true" fresco:roundTopRight="true" fresco:roundBottomLeft="true" fresco:roundBottomRight="true" fresco:roundingBorderWidth="10dp" fresco:roundingBorderColor="@android:color/black" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    代码说明:

    圆形圆角边框

    MainActivity 中的代码无需修改。

    运行效果(左边显示的是带边框的圆形图像,右边显示的是带边框的圆角图像):

    圆形边框圆角边框

  • 圆形或圆角图像底下的叠加颜色—roundWithOverlayColor:

    修改我们刚刚书写的 activity_main.xml :

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/main_sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@mipmap/icon_placeholder" fresco:placeholderImageScaleType="focusCrop" fresco:progressBarImage="@mipmap/icon_progress_bar" fresco:progressBarImageScaleType="focusCrop" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@mipmap/icon_failure" fresco:failureImageScaleType="focusCrop" fresco:retryImage="@mipmap/icon_retry" fresco:retryImageScaleType="focusCrop" fresco:fadeDuration="5000" fresco:backgroundImage="@android:color/holo_orange_light" fresco:roundWithOverlayColor="@android:color/darker_gray" fresco:roundAsCircle="true" ></com.facebook.drawee.view.SimpleDraweeView> </RelativeLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    代码说明:

    底下的颜色

    MainActivity 中的代码无需修改。

    运行效果(左边为圆形效果,右边为圆角效果):

    圆形效果圆角效果

  • 缩放类型—ScaleType:

    类型描述
    center居中,无缩放
    centerCrop保持宽高比缩小或放大,使得两边都大于或等于显示边界。居中显示。
    focusCrop同centerCrop, 但居中点不是中点,而是指定的某个点
    centerInside使两边都在显示边界内,居中显示。如果图尺寸大于显示边界,则保持长宽比缩小图片。
    fitCenter保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示
    fitStart同上。但不居中,和显示边界左上对齐
    fitEnd同fitCenter, 但不居中,和显示边界右下对齐
    fitXY不保存宽高比,填充满显示边界
    none如要使用tile mode显示, 需要设置为none

    推荐使用:focusCrop 类型

    Fresco中文说明对这一点也有详情的说明: 缩放

  • 总结:

    XML属性意义
    fadeDuration淡入淡出动画持续时间(单位:毫秒ms)
    actualImageScaleType实际图像的缩放类型
    placeholderImage占位图
    placeholderImageScaleType占位图的缩放类型
    progressBarImage进度图
    progressBarImageScaleType进度图的缩放类型
    progressBarAutoRotateInterval进度图自动旋转间隔时间(单位:毫秒ms)
    failureImage失败图
    failureImageScaleType失败图的缩放类型
    retryImage重试图
    retryImageScaleType重试图的缩放类型
    backgroundImage背景图
    overlayImage叠加图
    pressedStateOverlayImage按压状态下所显示的叠加图
    roundAsCircle设置为圆形图
    roundedCornerRadius圆角半径
    roundTopLeft左上角是否为圆角
    roundTopRight右上角是否为圆角
    roundBottomLeft左下角是否为圆角
    roundBottomRight右下角是否为圆角
    roundingBorderWidth圆形或者圆角图边框的宽度
    roundingBorderColor圆形或者圆角图边框的颜色
    roundWithOverlayColor圆形或者圆角图底下的叠加颜色(只能设置颜色)
    viewAspectRatio控件纵横比
  • GitHub:

    本教程最终项目GitHub地址:https://github.com/scp504677840/Fresco

11
 
0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对象映射工具AutoMapper介绍

AutoMapper是用来解决对象之间映射转换的类库。对于我们开发人员来说&#xff0c;写对象之间互相转换的代码是一件极其浪费生命的事情&#xff0c;AutoMapper能够帮助我们节省不少时间。 一. AutoMapper解决了什么问题? 要问AutoMapper解决了什么问题&#xff1f; 难道不是对象…

MindSpore安装教程【简洁易懂】

1 官网 MindSpore官网&#xff1a;MindSpore安装指南 2 关注社区 3 下载 查看自己python版本&#xff1a;使用python -V查看自己python版本 进入官网选择相应配置&#xff1a; 验证是否安装成功&#xff1a;python -c "import mindspore;mindspore.run_check()"&a…

一幅长文细学Vue(十三)——组合式中的生命周期

13 组合式API&#xff08;四&#xff09; 摘要&#xff1a;每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被…

OSGI 生命周期

1 生命周期管理 对于非模块化应用&#xff0c;生命周期将应用作为一个整体来操作&#xff1b;而对于模块化应用&#xff0c;则可以以细粒度的方式来管理应用的某一个独立部分。OSGi生命周期管理 OSGi生命周期层有两种不同的作用&#xff1a; 在应用程序外部&#xff0c;定义了对…

tomcat+nginx+redis实现均衡负载、session共享

在项目运营时&#xff0c;我们都会遇到一个问题&#xff0c;项目需要更新时&#xff0c;我们可能需先暂时关闭下服务器来更新。但这可能会出现一些状况:1.用户还在操作&#xff0c;被强迫终止了(我们可以看日志等没人操作的时候更新&#xff0c;但总可能会有万一)2.不知道的用户…

洛谷 P3184 [USACO16DEC]Counting Haybales数草垛

洛谷 P3184 [USACO16DEC]Counting Haybales数草垛 题目描述 Farmer John has just arranged his NN haybales (1 \leq N \leq 100,0001≤N≤100,000 ) at various points along the one-dimensional road running across his farm. To make sure they are spaced out appropria…

Entity Framework 6 Recipes 2nd Edition(13-2)译 - 用实体键获取一个单独的实体

问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Painting(绘画)类型的实体,如Figure 13-2所示: Figure 13-2. The Painting entity type in our model 在代码In Listi…

C#心得与经验(二)

本周学到很多C#关于Interface, Array的知识&#xff0c;在这里简单复习一下几个易混的地方&#xff0c;重在理解。 一、Interface 使用as来避免多态时没有接口的Exception&#xff1a; Document [] folder new Document[5]; for (int i 0; i < 5; i) {if (i % 2 0){fold…

项目总结(3.28)

项目是用vuewebpackelementUI 完成的。虽然没有什么深奥的技术和难点&#xff0c;但是有些细节还是值得注意的。 1、满足不同屏幕尺寸下缩放全屏显示。 单单只靠宽度、高度百分比是不可以实现的&#xff0c;比如如果宽度设置百分比&#xff0c;当屏幕宽度比较小时&#xff0c;这…

algorand共识协议_【Filecoin】理解预期共识 - 及它的优缺点

摘 要预期共识就是上帝掷飞镖预期共识的优点在于简单&#xff0c;而且每一次选举胜出者数量的平均数为1但预期共识不能保证每次选举的胜出者数量&#xff0c;这是其最大的问题期待有更好的基于可验证随机函数的共识算法出现&#xff0c;设计者可获得20万美金奖赏预期共识 就是 …

c++ 多个线程操作socket要同步吗_基础知识深化:NIO优化原理和Tomcat线程模型

1、I/O阻塞书上说BIO、NIO等都属于I/O模型&#xff0c;但是I/O模型这个范围有点含糊&#xff0c;我为此走了不少弯路。我们日常开发过程中涉及到NIO模型应用&#xff0c;如Tomcat、Netty中等线程模型&#xff0c;可以直接将其视为 网络I/O模型 。本文还是在基础篇章中介绍几种I…

Linux常用命令汇总--ln

1.功能&#xff1a;将一个文件或者文件夹链接到另外一个文件或者文件夹上。链接分为硬链接和软链接&#xff0c;硬链接可以看做是一个文件具有多个访问的入口&#xff0c;软链接可以看成是快捷方式。2.用法&#xff1a;ln [选项] 源文件或目录 目标文件或目录3.参数&#xff1a…

用同一uuid作为两个字段的值_这两个小技巧,让SQL语句不仅躲了坑,还提升了 1000 倍...

作者&#xff1a;帅地个人简介&#xff1a;一个热爱编程的在校生&#xff0c;我的世界不只有coding&#xff0c;还有writing。目前维护订阅号「苦逼的码农」&#xff0c;专注于写「算法与数据结构」&#xff0c;「Java」,「计算机网络」。本次来讲解与 SQL 查询有关的两个小知识…

Android SQLite详解

在项目开发中&#xff0c;我们或多或少都会用到数据库。在Android中&#xff0c;我们一般使用SQLite&#xff0c;因为Android在android.database.sqlite包封装了很多SQLite操作的API。我自己写了一个Demo来总结SQLite的使用&#xff0c;托管在Github上&#xff0c;大家可以点击…

Catalan数的理解

Catalan数的理解 f(0)1f(1)1f(2)2f(3)5f(4)14f(5)42f(2)f(1)f(1)f(3)f(2)f(1)*f(1)*f(2)f(4)f(3)f(2)*f(1)f(1)*f(2)f(3)通项公式&#xff1a;f(n) f(n-1) f(n-2)f(1) f(n-3)f(2) ... f(1)f(n-2) f(n-1) 理解&#xff1a;固定一个&#xff0c;n-1个全在左边&#xff0c;n-…

Type interface mapper.UserMapper is not known to the MapperRegistry

Type interface mapper.UserMapper is not known to the MapperRegistry. 报错&#xff1a;Type interface mapper.UserMapper is not known to the MapperRegistry. 解决&#xff1a;已经解决&#xff1b;请查看mapper是否配置正确&#xff0c;我下面就配置错误了。 解决效果…

微信整人假红包图片_警惕:千万别点!这些红包是假的

春节将至&#xff0c;又到了“考验手速”的时候。近年春节&#xff0c;“抢红包”为大家带来了“新年味”与许多快乐。但是&#xff0c;有些不法分子却从中捣乱&#xff0c;制造了一些假红包企图骗取钱财。如何辨别“假红包”&#xff1f;这里总结了几种“假红包”类型&#xf…

SQL Server中SCAN 和SEEK的区别

SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描&#xff08;scan&#xff09;和查找&#xff08;seek&#xff09;这两种算法从数据表和索引中读取数据。这两种算法构成了查询的基础&#xff0c;几乎无处不在。Scan会扫描并且返回整个表或整个索引。 而seek则更有效率&…

HDU 2897 (博弈 找规律) 邂逅明下

根据博弈论的两条规则&#xff1a; 一个状态是必胜状态当且仅当有一个后继是必败状态一个状态是必败状态当且仅当所有后继都是必胜状态然后很容易发现从1开始&#xff0c;前p个状态是必败状态&#xff0c;后面q个状态是必胜状态&#xff0c;然后循环往复。 1 #include <cstd…

C# 设置Excel打印选项及打印excel文档

C# 设置Excel打印选项及打印excel文档 打印Excel文档是一个很常见的操作&#xff0c;但有时候我们会碰到各种不同的打印需求&#xff0c;例如只打印一个Excel工作表的其中一部分&#xff0c;或打印时每页都有表头&#xff0c;或把工作表中超出1页所有内容打印到1页上等等&#…