其实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);
//下次使用这个线程
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=缩放;
}
公共无效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’);
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/128121.html
用户评论
秒淘你心窝
这个Surfaceview 实现的GIF播放真不错!以前用第三方库每次都怕出问题,现在自己控制着感觉更安心了,效率也提高不少呀!
有13位网友表示赞同!
回到你身边
终于有个简洁的解决方案,不用再烦那些复杂的动画框架了!学习一下这个思路,以后自己开发的时候可以用到。
有9位网友表示赞同!
日久见人心
GIF动画这块我一直没找到合适的方案,正好看到这个博文,试了一下效果不错!虽然有点基础知识需要了解,但是还是很方便的!
有13位网友表示赞同!
你tm的滚
Surfaceview 确实强大啊!不知道怎么就能实现这种流畅的动画播放,真想去深入学习一下代码细节了。不过文章写的比较抽象,希望能再详细点说明下原理。
有6位网友表示赞同!
傲世九天
这个作者厉害呀,竟然自己写了个包!而且文档看起来很清晰,我还在找合适的工具呢,这款软件一定要试试看!
有5位网友表示赞同!
不浪漫罪名
这种播放方式稳定性怎么样?万一应用退出或者内存不足会不会出现问题?希望作者能提到一些需要注意的地方,毕竟开发中这些细节很重要呢。
有5位网友表示赞同!
青衫负雪
GIF动画这个东西怎么说呢,有时候还挺好用的,尤其是用来展示产品效果的时候。虽然 SurfaceView 不是我习惯的方案,但这个打包方法确实方便了不少人使用.
有20位网友表示赞同!
无所谓
能不能支持更高压缩率的格式?现在的显示效果不太理想,毕竟手机屏幕越来越高,要保证画质的话帧数和文件的大小都会成为问题!
有17位网友表示赞同!
花花世界总是那么虚伪﹌
看着教程就觉得复杂了,我是个新手程序员啊…希望以后能有更详细的入门教学,能够方便更多人使用这个工具。
有5位网友表示赞同!
来瓶年的冰泉
这种方案会不会造成很大的性能损耗呢?我担心会导致手机运行变慢,尤其是长时间播放 GIF 动画的时候。
有11位网友表示赞同!
稳妥
这个库可以支持多种动画格式吗?我只想播放GIF动画,其他的就不需要了,这样可以节省空间和资源吧。
有16位网友表示赞同!
将妓就计
看了半天文章还没明白到底怎么做呢!能不能用图文并茂的方式解释一下?例如展示代码示例或详细步骤图,这样更容易理解。
有9位网友表示赞同!
寒山远黛
这个 GIF 包的兼容性怎么样?我需要在不同的 Android 版本上都能正常运行,最好能提供测试报告或者使用说明书。
有14位网友表示赞同!
無極卍盜
这个方案实现起来应该比较简单吧? 对于新手来说,学习曲线是不是比较陡峭呢?
有6位网友表示赞同!
命里缺他
Surfaceview 做动画真好玩啊!以后有机会我也试试自己用这个包来做个小游戏!
有9位网友表示赞同!
盲从于你
这种自定义包的开发确实很考验能力,毕竟要考虑各种兼容性和性能问题。佩服作者的研发水平!
有17位网友表示赞同!
蝶恋花╮
希望这个开源项目能得到更多人的关注和支持,这样作者才能更有动力继续更新和完善,让它成为更强大和实用的工具器!
有20位网友表示赞同!
敬情
Android 官方提供的动画库功能就足够用了嘛,为啥还要使用第三方库呢?感觉太麻烦了,直接用官方的方案就好。
有18位网友表示赞同!