/** * 自定义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);

更多相关文章

  1. android把字符串内容保存到指定路径
  2. Android 一个下载任务分为多个线程下载
  3. android 获取SD卡的图片及其路径
  4. Android 图片缩放与旋转的实现详解
  5. android 强制修改adb pull 文件的路径
  6. 关于android 调用系统图片浏览器并返回图片路径问题
  7. Android 多线程1

随机推荐

  1. A Visual Guide to Android(安卓)GUI Wid
  2. Android(安卓)TabWidget
  3. 自写登录页面空间水平、垂直居中xml配置
  4. 过期Gallery取代方案horizontalscrollVie
  5. 动画
  6. Android(安卓)Activity生命周期应用 网络
  7. android之gradle构建工具学习之路(二)
  8. android 如何利用手势放大和缩小一个图片
  9. Android(安卓)获取系统自带相机的照片
  10. Android利用BroadcastReceiver实现短信监