使用SurfaceView播放gif动画
2016-04-19 21:11
225 查看
SurfaceView:
SurfaceView一般会与SurfaceViewHolder(相当于SurfaceView的一个管家)结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,SurfaceView.getHolder()。
SurfaceHolder提供了如下方法来获得Canvas对象。
Canvas lockCanvas();锁定S~w对象,获取其canvas。
Canvas lockCanvas(Rect dirty);锁定其上Rect划分的区域,获取其Canvas。
哦对了,,SurfaceHolder一般需要添加一个CallBack来获取SurfaceView的状态,因为SurfaceView什么时候绘制完我们是不知道的,需要他来告诉。
SurfaceView一般会与SurfaceViewHolder(相当于SurfaceView的一个管家)结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,SurfaceView.getHolder()。
SurfaceHolder提供了如下方法来获得Canvas对象。
Canvas lockCanvas();锁定S~w对象,获取其canvas。
Canvas lockCanvas(Rect dirty);锁定其上Rect划分的区域,获取其Canvas。
哦对了,,SurfaceHolder一般需要添加一个CallBack来获取SurfaceView的状态,因为SurfaceView什么时候绘制完我们是不知道的,需要他来告诉。
public class GifSurfaceView extends SurfaceView implements Callback { private SurfaceHolder holder ; private String path; private float scale; /** * gif 动画绘制的开始坐标 */ private int x; private int y ; Handler mHandler = new Handler(); private Runnable run = new Runnable() { @Override public void run() { Canvas canvas = holder.lockCanvas(); canvas.save(); //进行缩放 canvas.scale(1f/scale, 1f/scale); movie.draw(canvas, x, y); canvas.restore(); holder.unlockCanvasAndPost(canvas); //设置时间:1 2 3 4 5 1 2 3 4 5 movie.setTime((int)(System.currentTimeMillis() % movie.duration())); mHandler.removeCallbacks(run); mHandler.postDelayed(run, 20);//让它不停的去画 } }; private Movie movie;//每一个gif可以看作一个小电影。 public GifSurfaceView(Context context,String path) { super(context); holder = getHolder();// 电影的播放器 holder.addCallback(this); this.path = path; } //surfaceView发生噶变 @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } //surfaceView创建成功了 @Override public void surfaceCreated(SurfaceHolder arg0) { initView(); } /** * 创建一个gif容器,同时根据容器的宽和高和gif的宽和高进行缩放并且居中 */ private void initView() { try { movie = Movie.decodeStream(getContext().getAssets().open(path)); int width = movie.width(); int height = movie.height(); float scaleX = width / (float)this.getWidth();//1 160/200.0=0 float scaleY = height / (float)this.getHeight(); /** * 确定我们gif缩放的比列 * * gif图片 再surfaceView的居中显示 */ if(scaleX>scaleY){ x = 0 ; y = (int)((getHeight()*scaleX - height)/2); scale = scaleX; }else{ y = 0 ; x = (int)((getWidth()*scaleY)/2); scale = scaleY; } mHandler.post(run); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ////surfaceView销毁了 @Override public void surfaceDestroyed(SurfaceHolder arg0) { mHandler.removeCallbacks(run); } }
相关文章推荐
- 你所不知道的android开发图标资源站
- python语法基础归纳(1)
- leetcode223题 题解 翻译 C语言版 Python版
- 我的第3个开源软件:MyThrift
- [leetcode] 258. Add Digits
- Android Studio中的keystore
- python socket服务器进行远程升级
- Android 事件拦截机制一种粗鄙的解释
- 淘宝双11技术实践:tomcat并行类加载
- 三次握手
- 数组与对象的深浅复制
- (1) MyBatis学习之准备--配置数据源、创建公用类
- 线代笔记1
- mongodb集群+分片部署(二)
- Struts2对于i18n的支持
- Spring 中的byName与 byType
- 关于Mac上的开发工具
- android_双击退出
- MySQL大数据高并发处理之-查询的优化
- 异步上传到又拍云的实例教程