国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 實(shí)現(xiàn)GIF播放的幾種方式

這篇具有很好參考價(jià)值的文章主要介紹了Android 實(shí)現(xiàn)GIF播放的幾種方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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>

調(diào)用load()方法,導(dǎo)入圖片并用ImageView顯示

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

當(dāng)然這樣的方式只能循環(huán)播放,如果想要指定循環(huán)次數(shù),需要調(diào)用GifDrawablesetLoopCount()方法。

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

            resource.start()
        }

    })

2. android-gif-drawable

android-gif-drawable也是Android上比較常用的圖片加載框架,android-gif-drawable 地址。

導(dǎo)入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)

// 設(shè)置循環(huán)次數(shù)
public void setLoopCount(@IntRange(from = 0, to = Character.MAX_VALUE) final int loopCount)
// 設(shè)置播放速度
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動(dòng)畫

自定義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 {
        // 關(guān)閉硬件加速
        setLayerType(View.LAYER_TYPE_SOFTWARE, mPaint)
    }

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

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

    // 設(shè)置播放資源,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) {
            // 循環(huán)播放
            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只是實(shí)現(xiàn)了循環(huán)播放的功能,可以自行定義其他功能。

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

ivGif.start()

4. AnimatedImageDrawable

AnimatedImageDrawable是Android9.0引入的繪制和顯示GIF和WebP等動(dòng)圖的類,而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. 總結(jié)

這4種方式都能很好地在手機(jī)上運(yùn)行,但在小米盒子上出現(xiàn)了不同的問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-780868.html

  • Glide本身就是很好用的圖片框架,但在小米盒子上出現(xiàn)了運(yùn)行緩慢的問題,一個(gè)3秒的GIF圖片需要十幾秒的時(shí)間才能跑完。
  • android-gif-drawable沒有出現(xiàn)運(yùn)行緩慢的問題,但刷新閃爍比較嚴(yán)重。
  • Movie能正常顯示GIF圖片,但如果想只運(yùn)行一次的情況下,很難顯示到最后一幀的圖片。
  • AnimatedImageDrawable最大的問題是版本要求太高,需要Android9.0。

到了這里,關(guān)于Android 實(shí)現(xiàn)GIF播放的幾種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android 大圖顯示優(yōu)化方案-加載Gif 自定義解碼器

    Android 大圖顯示優(yōu)化方案-加載Gif 自定義解碼器

    基于Glide做了圖片顯示的優(yōu)化,尤其是加載Gif圖的優(yōu)化,原生Glide加載Gif圖性能較低。在原生基礎(chǔ)上做了自定義解碼器的優(yōu)化,提升Glide性能 Glide加載大圖和Gif 尤其是列表存在gif時(shí),會(huì)有明顯卡頓,cpu和內(nèi)存占用較高, Glide的優(yōu)勢(shì) 就是有一套圖片生命周期的維護(hù),但是加載g

    2024年02月09日
    瀏覽(24)
  • 【方便的Opencv】實(shí)現(xiàn)播放有聲音的視頻+附帶圖片生成gif

    【方便的Opencv】實(shí)現(xiàn)播放有聲音的視頻+附帶圖片生成gif

    ????????因?yàn)樽罱鲜怯玫絆pencv這個(gè)庫來處理視頻,過程遇到了非常多的細(xì)節(jié)問題,最后把成品干脆直接放到博客來,這樣以后可以隨時(shí)過來取用。 ????????Opencv讀取視頻沒有聲音的原因是因?yàn)椋阂曨l是分為圖像與音頻的,Opencv僅僅只是讀取了一幀幀圖像,并沒有讀取

    2023年04月09日
    瀏覽(25)
  • Android常用的延遲執(zhí)行任務(wù)及輪詢定時(shí)任務(wù)的幾種方式

    Executor 的 execute 方法:向線程池中提交任務(wù)(異步執(zhí)行) Executor 接口是 Java 并發(fā)編程中的一個(gè)接口,它定義了一種執(zhí)行任務(wù)的通用機(jī)制。Executor 接口有一個(gè)重要的方法 execute,它的作用是提交一個(gè)任務(wù)(Runnable 或 Callable)給 Executor 進(jìn)行執(zhí)行。 execute 方法的作用如下: 提交任務(wù):

    2024年04月25日
    瀏覽(15)
  • iOS 使用 FLAnimatedImageView 播放GIF,并控制播放一次

    有時(shí)候會(huì)播放本地gif 圖片,并只播放一次, 我們這里使用FLAnimationImageView 實(shí)現(xiàn) 添加forcePause 屬性 計(jì)時(shí)器方法 修改計(jì)時(shí)器方法 添加下面這句 設(shè)置結(jié)束回調(diào)

    2024年02月10日
    瀏覽(11)
  • Python播放GIF圖片(ChatGPT代碼參考)

    Python播放GIF圖片(ChatGPT代碼參考)

    在網(wǎng)上找了好幾個(gè)方法, 最后還是出現(xiàn)各種問題,解決不了播放GIF的功能。 最后,通過ChatGPT給出了簡單明了的方案 (使用第三方庫 imageio 和 matplotlib.animation 來實(shí)現(xiàn)) ,調(diào)試直接通過。 但有小瑕疵,就是顯示gif時(shí)隱藏掉坐標(biāo)軸的功能無效,于是再做了一下優(yōu)化。 ? [最終代

    2024年02月10日
    瀏覽(14)
  • Qt 播放音頻文件的幾種方式

    Qt 播放音頻文件的幾種方式

    : Qt 、 QSound 、 QSoundEffect 、 QMediaPlayer 、 multimedia 這篇文章至少拖了有一兩個(gè)月了,這不陽了,在家實(shí)在是難受的要死,無心處理工作的事情,那就寫寫博客吧,因?yàn)轫?xiàng)目中需要用到播放音頻的功能,CV了部分代碼,這里就簡單的扯扯我對(duì) QSound 、 QSoundEffect 和 QMediaP

    2024年02月11日
    瀏覽(18)
  • Android修行手冊(cè) - 陰影效果的幾種實(shí)現(xiàn)以及一些特別注意點(diǎn)

    Android修行手冊(cè) - 陰影效果的幾種實(shí)現(xiàn)以及一些特別注意點(diǎn)

    Unity3D特效百例 案例項(xiàng)目實(shí)戰(zhàn)源碼 Android-Unity實(shí)戰(zhàn)問題匯總 游戲腳本-輔助自動(dòng)化 Android控件全解手冊(cè) 再戰(zhàn)Android系列 Scratch編程案例 軟考全系列 Unity3D學(xué)習(xí)專欄 藍(lán)橋系列 ChatGPT和AIGC 專注于 Android/Unity 和各種游戲開發(fā)技巧,以及 各種資源分享 (網(wǎng)站、工具、素材、源碼、游戲等

    2024年04月10日
    瀏覽(100)
  • Vue 3 + ffmpeg + wasm 實(shí)現(xiàn)前端視頻剪輯、音頻剪輯、音波展示、視頻抽幀、gif抽幀、幀播放器、字幕、貼圖、時(shí)間軸、素材軌道

    預(yù)覽 www.bilibili.com/video/BV1YT411Y7YJ 技術(shù)棧: ?? Vue 3、Vue-Router 4、Vite、pnpm、esbuild、TypeScript ?? Pinia 狀態(tài)管理 ?? Tailwind 原子css集成 ?? ffmpeg、wasm 底層音視頻處理集成 功能 多軌道時(shí)間軸,支持幀縮放,時(shí)間縮放 支持多種類型軌道的添加刪除 多功能軌道調(diào)節(jié),支持音視頻軌

    2024年02月11日
    瀏覽(31)
  • Unity播放帶Alpha通道的視頻【W(wǎng)ebM+Video Player】(替代播放GIF方案)

    Unity播放帶Alpha通道的視頻【W(wǎng)ebM+Video Player】(替代播放GIF方案)

    在Unity中播放GIF或者動(dòng)態(tài)效果,可以通過Video Player播放帶透明通道的WebM視頻來實(shí)現(xiàn)。 制作帶Alpha的MOV視頻 制作帶Alpha通道的MOV視頻有多重方式,如AE、PR、PS等等,具體制作過程可以自行百度。 將MOV視頻格式轉(zhuǎn)化為WebM格式 將WebM格式導(dǎo)入U(xiǎn)nity,設(shè)置視頻播放 完成動(dòng)態(tài)效果展示

    2024年02月13日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包