Android Gif 播放器
2015-10-30 10:53
381 查看
继承SurFaceView类
SurFaceView:SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。具体需要了解可以链接:http://www.cnblogs.com/xuling/archive/2011/06/06/android.html实现callback接口这样得到三个方法来回调处理
当Surfaceview被创建时执行
[code]public void surfaceCreated(SurfaceHolder holder) { }
Surfaceview发生变化时执行
[code]public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
Surfaceview销毁时执行
[code] @Override public void surfaceDestroyed(SurfaceHolder holder) { }
完整代码:
“`
package com.example.gifplayer;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class GifView extends SurfaceView implements Callback {
private String gifPath;
[code]public GifView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initGif(); } public GifView(Context context, AttributeSet attrs) { super(context, attrs); initGif(); } public GifView(Context context) { super(context); initGif(); } private SurfaceHolder holder; private Movie movie; private Handler handler; private float zoom = 1; private Runnable runable = new Runnable() { private Canvas canvas; public void run() { canvas = holder.lockCanvas(); // 保持当前帧 canvas.save(); canvas.scale(zoom, zoom); movie.draw(canvas, 0, 0); // 设置播放时间 // 123456789 %6 // 123450123 循环播放 movie.setTime((int) (System.currentTimeMillis() % movie.duration())); // 不影响其它帧 canvas.restore(); // 解锁 holder.unlockCanvasAndPost(canvas); // 定是执行发消息 handler.postDelayed(runable, 30); } }; /* * 设置GIF路径 */ public void setGif(String gifPath) { this.gifPath = gifPath; } // 设置放大倍数默认为1倍 public void setZoom(float d) { this.zoom = d; } /* * GIF初始化 */ public void initGif() { holder = getHolder(); holder.addCallback(this); handler = new Handler(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { try { InputStream inputStream = getContext().getAssets().open(gifPath); movie = Movie.decodeStream(inputStream); int width = movie.width(); int height = movie.height(); setMeasuredDimension((int) (width * zoom), (int) (height * zoom)); handler.post(runable); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { handler.removeCallbacks(runable); }
}
这种方式碰到加载比较大的gif的时候会比较慢,小的倒是挺灵活方便的
第一次发博客,也方便自己学习,一起加油吧。。。
相关文章推荐
- android中onSaveInstanceState和onRestoreInstanceState什么时候被调用
- Android结束进程的方法
- [Android]自定义一个可以展开显示更多的文本布局
- Android 和php交互及图片上传功能
- android 基础控件 EditText
- android 防丢器 ibeacon
- Android studio快捷键重写继承父类的抽象方法
- Android M 新的运行时权限开发者需要知道的一切
- [Android knowledge]
- Android MVP模式
- android项目开发之单元测试
- Android MVP模式
- android 图片时配
- Android程序调试
- Android ORM数据库框架之-greenDao(四)
- Mars老师的Android学习基本路线
- 修改Android系统设置方法
- Android:TabHost实现Tab切换
- Android 用纯代码实现复杂界面
- 浅析:Android--Fragment的懒加载