Android 解码播放GIF图像

简介:

 Android 播放GIF之前就有过一篇文章是讲述如何使用GIF文件并播放。可以通过 这里 了解关于播放GIF的一种方法。

  如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的GIF图片可能会将项目的体积变大,这点很多朋友都无法接受。不过这样的好处也显而易见,就是运行的速度会比你去解码的速度要快。

  以下这种方法是需要解码,但是速度的话保证不了,可能开线程的时候没有处理好吧,以下面这张图片为例做解码播放:

  首先,先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考。

 

 

 

之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下:

 

package com.terry.gif;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public   class  TypegifView extends View implements Runnable {
    gifOpenHelper gHelper;
    
private  boolean isStop  =   true ;
    
int  delta;
    String title;

    Bitmap bmp;

    
//  construct - refer for java
     public  TypegifView(Context context) {
        
this (context,  null );

    }

    
//  construct - refer for xml
     public  TypegifView(Context context, AttributeSet attrs) {
        super(context, attrs);
// 添加属性
        TypedArray ta  =  context.obtainStyledAttributes(attrs,
                R.styleable.gifView);
        
int  n  =  ta.getIndexCount();

        
for  ( int  i  =   0 ; i  <  n; i ++ ) {
            
int  attr  =  ta.getIndex(i);

            
switch  (attr) {
            
case  R.styleable.gifView_src:
                
int  id  =  ta.getResourceId(R.styleable.gifView_src,  0 );
                setSrc(id);
                
break ;

            
case  R.styleable.gifView_delay:
                
int  idelta  =  ta.getInteger(R.styleable.gifView_delay,  1 );
                setDelta(idelta);
                
break ;

            
case  R.styleable.gifView_stop:
                boolean sp 
=  ta.getBoolean(R.styleable.gifView_stop,  false );
                
if  ( ! sp) {
                    setStop();
                }
                
break ;
            }

        }

        ta.recycle();
    }

    
/* *
     * 设置停止
     * 
     * @param stop
     
*/
    
public   void  setStop() {
        isStop 
=   false ;
    }

    
/* *
     * 设置启动
     
*/
    
public   void  setStart() {
        isStop 
=   true ;

        Thread updateTimer 
=   new  Thread( this );
        updateTimer.start();
    }

    
/* *
     * 通过下票设置第几张图片显示
     * @param id
     
*/
    
public   void  setSrc( int  id) {

        gHelper 
=   new  gifOpenHelper();
        gHelper.read(TypegifView.
this .getResources().openRawResource(id));
        bmp 
=  gHelper.getImage(); //  得到第一张图片
    }

    
public   void  setDelta( int   is ) {
        delta 
=   is ;
    }

    
//  to meaure its Width & Height
    @Override
    
protected   void  onMeasure( int  widthMeasureSpec,  int  heightMeasureSpec) {
        setMeasuredDimension(measureWidth(widthMeasureSpec),
                measureHeight(heightMeasureSpec));
    }

    
private   int  measureWidth( int  measureSpec) {
        
return  gHelper.getWidth();
    }

    
private   int  measureHeight( int  measureSpec) {
        
return  gHelper.getHeigh();
    }

    
protected   void  onDraw(Canvas canvas) {
        
//  TODO Auto-generated method stub
        canvas.drawBitmap(bmp,  0 0 new  Paint());
        bmp 
=  gHelper.nextBitmap();

    }

    
public   void  run() {
        
//  TODO Auto-generated method stub
         while  (isStop) {
            
try  {
                
this .postInvalidate();
                Thread.sleep(gHelper.nextDelay() 
/  delta);
            } 
catch  (Exception ex) {

            }
        }
    }

}

 

 

基础功能实现后。可通过view.start()开启GIF的播放,或者view.stop()停止GIF的播放,代码如下:

 

setContentView(R.layout.main);
        Button btn 
=  (Button) findViewById(R.id.Button01);
        Button btn2 
=  (Button) findViewById(R.id.Button02);
        final TypegifView view 
=  (TypegifView) findViewById(R.id.gifView1);

        btn.setOnClickListener(
new  OnClickListener() {

            @Override
            
public   void  onClick(View v) {
                view.setStop();
            }
        });

        btn2.setOnClickListener(
new  OnClickListener() {

            @Override
            
public   void  onClick(View v) {
                view.setStart();
            }
        });

 

 

显示效果:

 

源码参见:gifPlayer





 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/478018,如需转载请自行联系原作者


相关文章
|
9月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
9月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
5月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
7月前
|
Android开发
Android 利用MediaPlayer实现音乐播放
本文提供了一个简单的Android MediaPlayer音乐播放示例,包括创建PlayerActivity、配置AndroidManifest.xml和activity_player.xml布局,以及实现播放和暂停功能的代码。
73 0
Android 利用MediaPlayer实现音乐播放
|
7月前
|
编解码 网络协议 开发工具
Android平台如何实现多路低延迟RTSP|RTMP播放?
本文档详细介绍了大牛直播SDK在Android平台上实现RTSP与RTMP流媒体播放及录像功能的技术细节。早在2015年,SDK的第一版就已经支持了多实例播放,并且通过简单的实例封装就能轻松实现。文档中提供了代码示例,展示了如何开启播放、停止播放以及开始和停止录像等功能。此外,SDK还提供了丰富的配置选项,例如设置录像目录、文件大小限制、转码选项等。总结部分列出了该SDK的关键特性,包括但不限于高稳定性和低延迟的播放能力、多实例支持、事件回调、硬解码支持、网络状态监控以及复杂的网络环境处理等。这些功能使得SDK能够应对各种应用场景,特别是在对延迟和稳定性有极高要求的情况下表现优异。
147 5
|
7月前
|
编解码 网络协议 vr&ar
Android平台下VR头显如何低延迟播放4K以上超高分辨率RTSP|RTMP流
这段内容讲述了VR头显中实现高分辨率视频播放的技术背景与实现方法,并强调了其重要性。高分辨率对于提升VR体验至关重要,它能提供更清晰的画面、增强沉浸感、补偿透镜放大效应,并维持宽广视场角下的图像质量。文中提到的大牛直播SDK具备极低的延迟(200-400ms),支持多种协议与格式,并具有丰富的功能特性,如多实例播放、事件回调、视频及音频格式支持等。此外,提供了基于Unity的播放器示例代码,展示了如何配置播放参数并开始播放。最后,作者指出此类技术在远程控制、虚拟仿真等应用场景中的重要意义。
|
9月前
|
开发工具 Android开发 开发者
Android `.9.png` 图像是用于UI的可拉伸格式,保持元素清晰度和比例
【6月更文挑战第26天】Android `.9.png` 图像是用于UI的可拉伸格式,保持元素清晰度和比例。通过边上的黑线定义拉伸区域,右下角黑点标识内容区域,适应文本或组件大小变化。常用于按钮、背景等,确保跨屏幕尺寸显示质量。Android SDK 提供`draw9patch.bat`工具来创建和编辑。**
288 6
|
9月前
|
存储 Android开发 Kotlin
Kotlin开发安卓app,在使用 MediaPlayer 播放 res/raw 中的音乐时遇到突然中断的问题,而 onErrorListener 没有接收到任何报错
在使用 Android MediaPlayer 播放 res/raw 中的音乐时遇到中断问题,可能的原因包括资源问题、媒体文件编码格式、生命周期管理和设备资源配置。要排查问题,检查音频文件是否正确包含,格式编码是否支持,MediaPlayer 是否正确管理及释放,以及设备是否有足够存储和配置。通过设置 onErrorListener 日志和确保在 onDestroy 中释放资源来调试。如果文件过大,考虑使用 AssetManager。遵循这些步骤可帮助诊断并解决播放中断的问题。
|
7天前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
65 19
|
1月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
70 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章