使用Fresco加载图片

关于 Fresco

Fresco 是一个强大的图片加载组件

Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。

Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用

Fresco 支持 Android2.3(API level 9) 及其以上系统。

特性

1.内存管理

解压后的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。在5.0以下,GC将会显著地引发界面卡顿。

在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。

Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。

2.图片的渐进式呈现

渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。

Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理。

3.Gif图和WebP格式

是的,支持加载Gif图,支持WebP格式。

4.图像的呈现(厉害的特性)

Fresco 的 Drawees 设计,带来一些有用的特性:

自定义居中焦点(对人脸等图片显示非常有帮助)

圆角图,当然圆圈也行。 下载失败之后,点击重现下载。 自定义占位图,自定义overlay, 或者进度条。

指定用户按压时的overlay, 图像的加载, Fresco 的 image pipeline 设计,允许用户在多方面控制图片的加载:

为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片, 先显示一个低解析度的图片,等高清图下载完之后再显示高清图, 加载完成回调通知。

对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图, 缩放或者旋转图片, 处理已下载的图片, WebP 支持。

程序运行截图

程序实现了fresco的渐进式加载图片和简单的使用方法,更多关于fresco可以点击这里查看官方API

xml清单文件配置

主要就是加入访问网络的权限和自定义一个MyAppcation

xml version="1.0" encoding="utf-8"?>
 xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.whoami.frescodemo">
     android:name="android.permission.INTERNET"/>
    
        android:name=".MyAppcation"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
         android:name=".MainActivity">
            
                 android:name="android.intent.action.MAIN" />

                 android:name="android.intent.category.LAUNCHER" />
            
        
    


activity_main.xml的布局

xml version="1.0" encoding="utf-8"?>
 xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"

    tools:context="com.example.whoami.frescodemo.MainActivity">
    
    
        android:id="@+id/my_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        fresco:placeholderImage="@android:drawable/stat_sys_download_done"
        />

新建MyAppcation.java

package com.example.whoami.frescodemo;

import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.facebook.imagepipeline.decoder.SimpleProgressiveJpegConfig;

/**
 * Created by whoami on 2016/6/8.
 */
public class MyAppcation extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
                .setProgressiveJpegConfig(new SimpleProgressiveJpegConfig())
                .build();
        Fresco.initialize(this,config);
    }
}

MainActivity.java

package com.example.whoami.frescodemo;

import android.net.Uri;
import android.support.annotation.UiThread;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;

public class MainActivity extends AppCompatActivity {
    SimpleDraweeView my_image_view;
    String url = "http://image55.360doc.com/DownloadImg/2012/09/1618/26871610_1.jpg";
    String url2 = "http://d.hiphotos.baidu.com/image/pic/item/738b4710b912c8fc889cb8f2ff039245d68821a5.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.my_image_view = (SimpleDraweeView) findViewById(R.id.my_image_view);
       //showImage();
        showImage_1();
    }
    //简单使用的方法
    private void showImage() {
        Uri uri = Uri.parse("http://www.liaohuqiu.net/assets/img/qrcode_for_wechat_mp.jpg");

        my_image_view.setImageURI(uri);
    }
    //带渐进显示的效果
    public void showImage_1(){
        Uri uri = Uri.parse(url);
        ImageRequest request = ImageRequestBuilder
                .newBuilderWithSource(uri)
                .setProgressiveRenderingEnabled(true)
                .build();

        PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .build();

        my_image_view.setController(controller);
    }
    //多图显示,可以实现先显示缩略图,等高清图片加载完成以后再把缩略图替换成高清图片的功能
    public void showImage_2(){
        Uri lowResUri, highResUri;
        lowResUri = Uri.parse("");//低分辨率uri
        highResUri = Uri.parse("");//高分辨率uri

        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setLowResImageRequest(ImageRequest.fromUri(lowResUri))
                .setImageRequest(ImageRequest.fromUri(highResUri))
                .setOldController(my_image_view.getController())
                .build();
        my_image_view.setController(controller);
    }
}

源代码下载

百度云下载地址一

百度云下载地址二,提取码:5k3y


你可能感兴趣的:(java)