Android 自定义Gif动画
16lz
2021-01-23
/** * 自定义Gif动画 SurfaceView的实现主要是实现高速预览 我们将GIF图片绘制在SurfaceView上 */public class GifSurfaceView extends SurfaceView implements Callback { // 监听 private SurfaceHolder holder; // 影片类 private Movie movie; // 输入流 private InputStream is = null; // 缩放 private float zoom = 1f; // 图片路径 private String path; // 判断是否网络读取 private boolean isNet = false; // 逐步播放 private Handler handler = new Handler(); private Runnable run = new Runnable() { @Override public void run() { // 不断绘制 Canvas canvas = holder.lockCanvas(); // 绘制的时候进行缩放比例,不影响下次绘图操作 canvas.save(); canvas.scale(zoom, zoom); movie.draw(canvas, 0, 0); canvas.restore(); holder.unlockCanvasAndPost(canvas); // 开始绘制 movie.setTime((int) (System.currentTimeMillis() % movie.duration())); handler.removeCallbacks(run); // 下次还用这个线程 handler.postDelayed(run, 30); } }; // 构造方法 public GifSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); holder = getHolder(); holder.addCallback(this); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { try { // 判断读取方法 if (isNet) { is = new URL(path).openConnection().getInputStream(); } else { // 本地读取文件 is = getContext().getAssets().open(path); } // 读取流 movie = Movie.decodeStream(is); // 设置SurfaceView的宽高 int width = movie.width(); int height = movie.height(); setMeasuredDimension((int) (width * zoom), (int) (height * zoom)); // 播放gif的帧动画 handler.post(run); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { // SurfaceView被销毁时结束线程 handler.removeCallbacks(run); } public void setZoom(float zoom) { this.zoom = zoom; } public void setPath(String path) { this.path = path; } public void setNet(boolean isNet) { this.isNet = isNet; }}
使用方式
GifSurfaceView gsv = (GifSurfaceView) findViewById(R.id.gif_view);// 设置路径,这个路径实际上在自定义View中是可更改的,我们在assets目录下放置一张gif图片gsv.setPath("anim.gif");// 设置缩放大小gsv.setZoom(2f);
更多相关文章
- android把字符串内容保存到指定路径
- Android 一个下载任务分为多个线程下载
- android 获取SD卡的图片及其路径
- Android 图片缩放与旋转的实现详解
- android 强制修改adb pull 文件的路径
- 关于android 调用系统图片浏览器并返回图片路径问题
- Android 多线程1