Android显示Gif动图

原创 2016年06月01日 16:33:14
package org.media.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Movie;
import android.os.Handler;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;
import java.io.InputStream;


public class DrawingGif extends SurfaceView implements SurfaceHolder.Callback{

    private final static String TAG = "DrawingGif";

    private int scale = 1;
    private String path;
    private SurfaceHolder mHolder;
    private Canvas canvas;
    private Movie movie;
    private Handler mHandler;

    public DrawingGif(Context context) {
        this(context,null);
    }

    public DrawingGif(Context context, AttributeSet attrs) {
        this(context,attrs,0);
    }

    public DrawingGif(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init(){
        Log.d(TAG,"init");
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHandler = new Handler();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "surfaceCreated");
        new Thread(mRunnable).start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Log.d(TAG,"surfaceChanged");
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(TAG,"surfaceDestroyed");
        mHandler.removeCallbacks(mRunnable);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.d(TAG,"onMeasure,path:"+path);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (!TextUtils.isEmpty(path)){
            try {
                InputStream ins = getContext().getAssets().open(path);
                movie = Movie.decodeStream(ins);
                int width = movie.width();
                int height = movie.height();
                setMeasuredDimension(width*scale,height*scale);
                //mHandler.post(mRunnable);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            if (!TextUtils.isEmpty(path)){
                canvas = mHolder.lockCanvas();
                canvas.save();
                canvas.drawColor(Color.WHITE);
                canvas.scale(scale, scale);
                movie.draw(canvas, 0, 0);
                movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
                canvas.restore();
                mHolder.unlockCanvasAndPost(canvas);
                mHandler.postDelayed(mRunnable, 50);
            }
        }
    };

    public int getScale() {
        return scale;
    }

    public void setScale(int scale) {
        this.scale = scale;
        invalidate();
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
        invalidate();
    }
}

使用:
gif = (DrawingGif) findViewById(R.id.gif);
        gif.setPath("2.gif");//asset路径
        gif.setScale(5);
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android-pulltorefresh 下拉加载中使用gif动图

效果预览: xml布局 <com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:android="http://schemas...

Android ImageView实现类似Gif动图的效果

已经过时的方法: android studio会报错: 错误行:imageView.setBackgroundResource(R.anim.framebyframe);   错误为:expected...

Android APP设计加载使用gif动图需要注意的一般性问题

Android APP设计加载使用gif动图需要注意的一般性问题 (1)gif图片尺寸大小问题。gif图片的尺寸通常不会太小,这些图片如果从网络加载将消耗手机用户更多的网路流量。若是流量付费...

Android中使用Movie显示gif动态图

版权声明:本文为博主原创文章,转载请注明出处。博客首页:http://blog.csdn.net/u012975705。订阅:http://blog.csdn.net/u012975705/rss/l...

Android下载并显示GIF图

最近项目需要实现在线加载GIF图的功能,于是我在网上翻了一番,发现有个开源项目(android-gif-drawable)可以很好的支持GIF动态图的显示。而且它的底层解码使用C实现,极大的提高了解码...

Android中使用Movie显示gif动态图

在看这篇博文之前对attr自定义属性还是不是很熟的童鞋可以先看看:Android中attr详解(http://blog.csdn.net/u012975705/article/details/4871...

Android中显示gif图(支持多张显示)

方法一:通过webview的方式显示gif图 ,这种方式现在只发现一个问题,gif图播放久了会有卡顿一下,但是过一会又正常。其他的问题还没有发现,有待后面发现解决: 这是xml中定义的webview ...

android 动态图gif显示俩种方法

//使用条件 1》都叫兽 GIF制作(软件):把gif动态图分解成一帧一帧的 ***********************************************************...

Android 显示Gif动态图和静态图

Android 显示Gif动态图和静态图今天写了个demo来显示网络图片,静态图都好说,很容易就可以显示,但是动态图呢?安卓里是没有自带的控件来显示gif图的,开发大神们可以自己写View来支持gif...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)