Android 動圖 WebP Gif 的 播放 和 暫停
阿新 • • 發佈:2019-02-17
先說明一下:目前 支援 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 控制元件 的異常