Android SurfaceView实现GIF动画帧封装并播放GIF动画

写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还是要追究一下原理怎么做的,我们新建一个GifLibrary,然后右键Pr

其实Android SurfaceView实现GIF动画帧封装并播放GIF动画的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享Android SurfaceView实现GIF动画帧封装并播放GIF动画的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

然后我们新建一个类GifSurfaceView,继承自SurfaceView,并实现其Callback接口

Gif 表面视图

com.lgl.giflibrary 包;

导入java.io.IOException;

导入java.io.InputStream;

导入java.net.URL;

导入android.content.Context;

导入android.graphics.Canvas;

导入android.graphics.Movie;

导入android.os.Handler;

导入android.util.AttributeSet;

导入android.view.SurfaceHolder;

导入android.view.SurfaceHolder.Callback;

导入android.view.SurfaceView;

/**

* 自定义Gif动画引擎SurfaceView的实现主要是实现高速预览。我们在SurfaceView 上绘制GIF 图像。

*

*@作者LGL

*

*/

公共类GifSurfaceView 扩展SurfaceView 实现回调{

//听

私人SurfaceHolder 支架;

//视频类

私人电影;

//输入流

私有输入流=null;

//飞涨

私有浮动缩放=1f;

//图片路径

私有字符串路径;

//判断是否从网络读取

私有布尔isNet=false;

//逐步播放

私有Handler 处理程序=new Handler();

私有Runnable 运行=new Runnable() {

@覆盖

公共无效运行(){

//继续绘图

画布画布=holder.lockCanvas();

//绘制时缩放不会影响下一步的绘制操作

画布.保存();

canvas.scale(缩放,缩放);

电影.draw(画布, 0, 0);

画布.恢复();

holder.unlockCanvasAndPost(canvas);

//开始绘图

movie.setTime((int) (System.currentTimeMillis() % movie.duration()));

handler.removeCallbacks(run);

//下次使用这个线程

Android SurfaceView实现GIF动画帧封装并播放GIF动画

handler.postDelayed(运行, 30);

}

};

//构造函数

公共GifSurfaceView(上下文上下文,AttributeSet attrs){

超级(上下文,属性);

持有者=getHolder();

holder.addCallback(this);

}

@覆盖

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

尝试{

//确定读取方法

如果(isNet){

is=new URL(path).openConnection().getInputStream();

} 别的{

//本地读取文件

is=getContext().getAssets().open(路径);

}

//读取流

电影=Movie.decodeStream(is);

//设置SurfaceView的宽度和高度

int 宽度=movie.width();

int height=movie.height();

setMeasuredDimension((int) (宽度* 缩放), (int) (高度* 缩放));

//播放gif的帧动画

处理程序.post(运行);

} catch (IOException e) {

//TODO 自动生成的catch 块

e.printStackTrace();

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

//初始化完成

@覆盖

公共无效surfaceCreated(SurfaceHolder持有者){

//读取视频流

}

@覆盖

公共无效surfaceChanged(SurfaceHolder持有者,int格式,int宽度,

int 高度) {

}

@覆盖

公共无效surfaceDestroyed(SurfaceHolder持有者){

//当SurfaceView被销毁时结束线程

handler.removeCallbacks(run);

}

公共无效setZoom(浮动缩放){

this.zoom=缩放;

}

Android SurfaceView实现GIF动画帧封装并播放GIF动画

公共无效setPath(字符串路径){

this.path=路径;

}

公共无效setNet(布尔isNet){

this.isNet=isNet;

}

}

布局_main.xml

相对布局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’

android:background=’#fff’

android:gravity=’中心’

com.lgl.giflibrary.GifSurfaceView

android:layout_width=’wrap_content’

android:layout_height=’wrap_content’ /

/相对布局

这里不难看出我们判断了两种方式,从网络加载还是本地加载,以及缩放比例是多少。然后我们就会使用它。我们直接新建一个项目GifDemo,同样的方法右键Properties——Android,然后添加一个库

布局_main.xml

相对布局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’

com.lgl.giflibrary.GifSurfaceView

android:id=’@+id/gsv’

android:layout_width=’wrap_content’

android:layout_height=’wrap_content’

android:layout_centerVertical=’true’ /

/相对布局

然后我们会在MainActivity中使用它

//初始化

私有GifSurfaceView gsv;

gsv=(GifSurfaceView) findViewById(R.id.gsv);

//设置路径。这个路径实际上是在库中更改的。我们将gif 图像放置在asset 目录中。

gsv.setPath(‘phont.gif’);

//设置缩放大小

gsv.setZoom(2f);

让我们运行一下

当然,如果是从网上下载的,我们也可以用之前搭建的tomcat服务器进行测试。

gsv=(GifSurfaceView) findViewById(R.id.gsv);

//设置路径

//gsv.setPath(‘photo.gif’);

//设置缩放大小F

gsv.setZoom(2f);

//如果是网络,记得添加权限

gsv.setNet(true);

gsv.setPath(‘http://localhost:8080/lgl/photo.gif’);

用户评论

Android SurfaceView实现GIF动画帧封装并播放GIF动画
秒淘你心窝

这个Surfaceview 实现的GIF播放真不错!以前用第三方库每次都怕出问题,现在自己控制着感觉更安心了,效率也提高不少呀!

    有13位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
回到你身边

终于有个简洁的解决方案,不用再烦那些复杂的动画框架了!学习一下这个思路,以后自己开发的时候可以用到。

    有9位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
日久见人心

GIF动画这块我一直没找到合适的方案,正好看到这个博文,试了一下效果不错!虽然有点基础知识需要了解,但是还是很方便的!

    有13位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
你tm的滚

Surfaceview 确实强大啊!不知道怎么就能实现这种流畅的动画播放,真想去深入学习一下代码细节了。不过文章写的比较抽象,希望能再详细点说明下原理。

    有6位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
傲世九天

这个作者厉害呀,竟然自己写了个包!而且文档看起来很清晰,我还在找合适的工具呢,这款软件一定要试试看!

    有5位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
不浪漫罪名

这种播放方式稳定性怎么样?万一应用退出或者内存不足会不会出现问题?希望作者能提到一些需要注意的地方,毕竟开发中这些细节很重要呢。

    有5位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
青衫负雪

GIF动画这个东西怎么说呢,有时候还挺好用的,尤其是用来展示产品效果的时候。虽然 SurfaceView 不是我习惯的方案,但这个打包方法确实方便了不少人使用.

    有20位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
无所谓

能不能支持更高压缩率的格式?现在的显示效果不太理想,毕竟手机屏幕越来越高,要保证画质的话帧数和文件的大小都会成为问题!

    有17位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
花花世界总是那么虚伪﹌

看着教程就觉得复杂了,我是个新手程序员啊…希望以后能有更详细的入门教学,能够方便更多人使用这个工具。

    有5位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
来瓶年的冰泉

这种方案会不会造成很大的性能损耗呢?我担心会导致手机运行变慢,尤其是长时间播放 GIF 动画的时候。

    有11位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
稳妥

这个库可以支持多种动画格式吗?我只想播放GIF动画,其他的就不需要了,这样可以节省空间和资源吧。

    有16位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
将妓就计

看了半天文章还没明白到底怎么做呢!能不能用图文并茂的方式解释一下?例如展示代码示例或详细步骤图,这样更容易理解。

    有9位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
寒山远黛

这个 GIF 包的兼容性怎么样?我需要在不同的 Android 版本上都能正常运行,最好能提供测试报告或者使用说明书。

    有14位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
無極卍盜

这个方案实现起来应该比较简单吧? 对于新手来说,学习曲线是不是比较陡峭呢?

    有6位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
命里缺他

Surfaceview 做动画真好玩啊!以后有机会我也试试自己用这个包来做个小游戏!

    有9位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
盲从于你

这种自定义包的开发确实很考验能力,毕竟要考虑各种兼容性和性能问题。佩服作者的研发水平!

    有17位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
蝶恋花╮

希望这个开源项目能得到更多人的关注和支持,这样作者才能更有动力继续更新和完善,让它成为更强大和实用的工具器!

    有20位网友表示赞同!

Android SurfaceView实现GIF动画帧封装并播放GIF动画
敬情

Android 官方提供的动画库功能就足够用了嘛,为啥还要使用第三方库呢?感觉太麻烦了,直接用官方的方案就好。

    有18位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/128121.html

(0)
小su的头像小su
上一篇 2024年9月1日 下午11:54
下一篇 2024年9月2日 上午12:01

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注