Android显示Gif动图
2016-06-01 16:33
351 查看
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);
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories