Android 实现GIF播放的几种方式

这篇具有很好参考价值的文章主要介绍了Android 实现GIF播放的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. Glide播放

Glide是Android上比较常见的图片加载框架,其介绍可以看Android Glide简单使用。

布局文件,GIF文件可以在ImageView里面显示

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

    <ImageView
        android:id="@+id/iv_gif"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter"/>

</RelativeLayout>

调用load()方法,导入图片并用ImageView显示

var ivGif: ImageView = findViewById(R.id.iv_gif)
Glide.with(this)
    .load("file:///android_asset/sample.gif")
    .into(ivGif)

当然这样的方式只能循环播放,如果想要指定循环次数,需要调用GifDrawablesetLoopCount()方法。

Glide.with(this)
    .asGif()
    .load("file:///android_asset/sample.gif")
    .into(object : SimpleTarget<GifDrawable>() {
        override fun onResourceReady(
                resource: GifDrawable,
                transition: Transition<in GifDrawable>?) {
            // 循环播放两次
            resource.setLoopCount(2)
            ivGif.setImageDrawable(resource)

            resource.start()
        }

    })

2. android-gif-drawable

android-gif-drawable也是Android上比较常用的图片加载框架,android-gif-drawable 地址。

导入android-gif-drawable

dependencies {
    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.25'
}

布局文件,GifImageView显示GIF文件

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

    <pl.droidsonroids.gif.GifImageView
        android:id="@+id/iv_gif"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter"/>

</RelativeLayout>

GifDrawable被用来加载图片资源,

public GifDrawable(@NonNull Resources res, @RawRes @DrawableRes int id)
public GifDrawable(@NonNull AssetManager assets, @NonNull String assetName)
public GifDrawable(@NonNull String filePath)
public GifDrawable(@NonNull File file)
public GifDrawable(@NonNull InputStream stream)
public GifDrawable(@NonNull AssetFileDescriptor afd)
public GifDrawable(@NonNull FileDescriptor fd)
public GifDrawable(@NonNull byte[] bytes)
public GifDrawable(@NonNull ByteBuffer buffer)

// 设置循环次数
public void setLoopCount(@IntRange(from = 0, to = Character.MAX_VALUE) final int loopCount)
// 设置播放速度
public void setSpeed(@FloatRange(from = 0, fromInclusive = false) final float factor)

播放GIF文件

var ivGif: GifImageView = findViewById(R.id.iv_gif)
var drawable = GifDrawable(assets, "sample.gif")
ivGif.setImageDrawable(drawable)

3. Movie

Movie是Android自带的类,可以用来加载播放GIF动画

自定义GifImageView用来播放GIF文件

class GifImageView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
    View(context, attrs, defStyleAttr) {

    private var mMovie: Movie? = null
    private var mMovieStart: Long = 0
    private var mStarted: Boolean = false
    private var mDuration: Int = 0
    private var mPaint: Paint = Paint()

    init {
        // 关闭硬件加速
        setLayerType(View.LAYER_TYPE_SOFTWARE, mPaint)
    }

    constructor(context: Context): this(context, null)

    constructor(context: Context, attrs: AttributeSet?): this(context, attrs, 0)

    // 设置播放资源,Movie支持decodeStream和decodeFile
    fun setResource(inputStream: InputStream) {
        try {
            mMovie = Movie.decodeStream(inputStream)
            mDuration = mMovie?.duration() ?: 1000
        } catch (e: Exception) {
        }
    }

    fun start() {
        mMovieStart = SystemClock.elapsedRealtime()
        mStarted = true

        invalidate()
    }

    fun stop() {
        mMovieStart = 0
        mStarted = false
        invalidate()
    }

    override fun onDraw(canvas: Canvas?) {
        var movie = mMovie
        if (mStarted && movie != null) {
            // 循环播放
            var realTime = (SystemClock.elapsedRealtime()  - mMovieStart).toInt() % mDuration
            movie.setTime(realTime)

            // 居中播放
            var scale = movie.width() * 1.0f / width
            movie.draw(canvas, 0f,  (height - movie.height() * scale) / 2)

            invalidate()
        }

    }

}

布局文件

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

    <com.blog.demo.image.gif.GifImageView
        android:id="@+id/iv_gif"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

播放GIF文件,文中的GifImageView只是实现了循环播放的功能,可以自行定义其他功能。

var ivGif: GifImageView = findViewById(R.id.iv_gif)
ivGif.setResource(assets.open("sample.gif"))

ivGif.start()

4. AnimatedImageDrawable

AnimatedImageDrawable是Android9.0引入的绘制和显示GIF和WebP等动图的类,而ImageDecoder同样是Android9.0新引入的图像解码器。

var ivGif: ImageView = findViewById(R.id.iv_gif)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    val source = ImageDecoder.createSource(assets, "sample.gif")
    Thread {
        val drawable = ImageDecoder.decodeDrawable(source)
        ivGif.post {
            ivGif.setImageDrawable(drawable)
            if (drawable is AnimatedImageDrawable) {
                drawable.start()
            }
        }
    }.start()
}

5. 总结

这4种方式都能很好地在手机上运行,但在小米盒子上出现了不同的问题。文章来源地址https://www.toymoban.com/news/detail-780868.html

  • Glide本身就是很好用的图片框架,但在小米盒子上出现了运行缓慢的问题,一个3秒的GIF图片需要十几秒的时间才能跑完。
  • android-gif-drawable没有出现运行缓慢的问题,但刷新闪烁比较严重。
  • Movie能正常显示GIF图片,但如果想只运行一次的情况下,很难显示到最后一帧的图片。
  • AnimatedImageDrawable最大的问题是版本要求太高,需要Android9.0。

到了这里,关于Android 实现GIF播放的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 大图显示优化方案-加载Gif 自定义解码器

    基于Glide做了图片显示的优化,尤其是加载Gif图的优化,原生Glide加载Gif图性能较低。在原生基础上做了自定义解码器的优化,提升Glide性能 Glide加载大图和Gif 尤其是列表存在gif时,会有明显卡顿,cpu和内存占用较高, Glide的优势 就是有一套图片生命周期的维护,但是加载g

    2024年02月09日
    浏览(37)
  • 【方便的Opencv】实现播放有声音的视频+附带图片生成gif

            因为最近老是用到Opencv这个库来处理视频,过程遇到了非常多的细节问题,最后把成品干脆直接放到博客来,这样以后可以随时过来取用。         Opencv读取视频没有声音的原因是因为:视频是分为图像与音频的,Opencv仅仅只是读取了一帧帧图像,并没有读取

    2023年04月09日
    浏览(46)
  • Android常用的延迟执行任务及轮询定时任务的几种方式

    Executor 的 execute 方法:向线程池中提交任务(异步执行) Executor 接口是 Java 并发编程中的一个接口,它定义了一种执行任务的通用机制。Executor 接口有一个重要的方法 execute,它的作用是提交一个任务(Runnable 或 Callable)给 Executor 进行执行。 execute 方法的作用如下: 提交任务:

    2024年04月25日
    浏览(46)
  • iOS 使用 FLAnimatedImageView 播放GIF,并控制播放一次

    有时候会播放本地gif 图片,并只播放一次, 我们这里使用FLAnimationImageView 实现 添加forcePause 属性 计时器方法 修改计时器方法 添加下面这句 设置结束回调

    2024年02月10日
    浏览(40)
  • Python播放GIF图片(ChatGPT代码参考)

    在网上找了好几个方法, 最后还是出现各种问题,解决不了播放GIF的功能。 最后,通过ChatGPT给出了简单明了的方案 (使用第三方库 imageio 和 matplotlib.animation 来实现) ,调试直接通过。 但有小瑕疵,就是显示gif时隐藏掉坐标轴的功能无效,于是再做了一下优化。   [最终代

    2024年02月10日
    浏览(37)
  • Qt 播放音频文件的几种方式

    : Qt 、 QSound 、 QSoundEffect 、 QMediaPlayer 、 multimedia 这篇文章至少拖了有一两个月了,这不阳了,在家实在是难受的要死,无心处理工作的事情,那就写写博客吧,因为项目中需要用到播放音频的功能,CV了部分代码,这里就简单的扯扯我对 QSound 、 QSoundEffect 和 QMediaP

    2024年02月11日
    浏览(43)
  • Android修行手册 - 阴影效果的几种实现以及一些特别注意点

    Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总 游戏脚本-辅助自动化 Android控件全解手册 再战Android系列 Scratch编程案例 软考全系列 Unity3D学习专栏 蓝桥系列 ChatGPT和AIGC 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游戏等

    2024年04月10日
    浏览(51)
  • Vue 3 + ffmpeg + wasm 实现前端视频剪辑、音频剪辑、音波展示、视频抽帧、gif抽帧、帧播放器、字幕、贴图、时间轴、素材轨道

    预览 www.bilibili.com/video/BV1YT411Y7YJ 技术栈: 💪 Vue 3、Vue-Router 4、Vite、pnpm、esbuild、TypeScript ☀️ Pinia 状态管理 🌪 Tailwind 原子css集成 💥 ffmpeg、wasm 底层音视频处理集成 功能 多轨道时间轴,支持帧缩放,时间缩放 支持多种类型轨道的添加删除 多功能轨道调节,支持音视频轨

    2024年02月11日
    浏览(55)
  • Unity播放带Alpha通道的视频【WebM+Video Player】(替代播放GIF方案)

    在Unity中播放GIF或者动态效果,可以通过Video Player播放带透明通道的WebM视频来实现。 制作带Alpha的MOV视频 制作带Alpha通道的MOV视频有多重方式,如AE、PR、PS等等,具体制作过程可以自行百度。 将MOV视频格式转化为WebM格式 将WebM格式导入Unity,设置视频播放 完成动态效果展示

    2024年02月13日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包