1. 程式人生 > >Android 動圖 WebP Gif 的 播放 和 暫停

Android 動圖 WebP Gif 的 播放 和 暫停

先說明一下:目前 支援 webp 動圖 的 三方圖片庫,只有Fresco,想控制 動圖 播放 和 暫停 的 也只有 Fresco
(宣告:博主並不是 Fresco 的 鐵粉,其他的三方庫也都用過,只不過本文標題的功能 目前只有 Fresco 能簡單實現)

先看一下效果:

這裡寫圖片描述

Gradle新增引用:

compile 'com.facebook.fresco:fresco:1.3.0'
compile 'com.facebook.fresco:animated-webp:1.3.0'
compile 'com.facebook.fresco:animated-gif:1.3.0'

fresco 是 必須 新增 的,webp 和 gif 看專案 按需 新增,這裡 拿 WebP 舉例


(這裡說明一下:如果添加了 animated-webp 的引用,就不用再新增 webpsupport 的引用)

佈局檔案 activity_main:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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" tools:context="com.example.webp.MainActivity">
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/sdv" android:layout_width="200dp" android:layout_height="200dp" android:layout_centerInParent="true"/> </RelativeLayout>

Java程式碼 MainActivity:

package com.example.webp;

import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.controller.ControllerListener;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.animated.base.AbstractAnimatedDrawable;
import com.facebook.imagepipeline.image.ImageInfo;

public class MainActivity extends AppCompatActivity {

    String webp1 = "https://isparta.github.io/compare-webp/image/gif_webp/webp/1.webp";

    SimpleDraweeView sdv;
    AbstractAnimatedDrawable animatable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Fresco.initialize(this);
        setContentView(R.layout.activity_main);

        sdv = (SimpleDraweeView) findViewById(R.id.sdv);

        ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
            @Override
            public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {
                if (anim != null) {
                    anim.start();
                }
                animatable = (AbstractAnimatedDrawable) anim;
            }
        };

        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(Uri.parse(webp1))
                .setControllerListener(controllerListener)
                .build();
        sdv.setController(controller);


//        final Animatable animatable = sdv.getController().getAnimatable();
        sdv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (animatable != null) {
                    if (animatable.isRunning()) {
                        animatable.pause();
                    } else {
                        animatable.start();
                    }
                }
            }
        });

    }
}

注意:Fresco.initialize(this); 這句 初始化 程式碼 應該 放到 Application 裡面,我這裡 圖方便 就放到 Activity 裡面了。可以 看到 我 這句程式碼 放到了 setContentView 之前,因為初始化之前,用該庫的 控制元件 會報錯。也就是說,如果初始化放到 setContentView 之後,就會報佈局檔案 activity_main 裡面 SimpleDraweeView 控制元件 的異常