android显示gif动态图的方法
来源:互联网 发布:淘宝网子账号 编辑:程序博客网 时间:2024/04/28 15:16
最近的项目有了这个需求,然后上网找了找,没有找到个非常完美的方案,google上那个开源项目GifView有oom的错误,由于项目紧急,就没有深入研究代码。后来在网上找到一段代码,说白了就是一个自定义的可播放gif图片的空间。
这里使用了movie来显示,有兴趣的可以自己去研究下google的api和源代码。
import java.io.ByteArrayOutputStream;import java.io.InputStream;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Movie;import android.util.AttributeSet;import android.view.View;public class GifView extends View {private int gifResource;private Movie mMovie;private long movieStart;public GifView(Context context, byte[] data) {super(context);// initializeView();setGIFResource(data);}public GifView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initializeView();}public GifView(Context context, AttributeSet attrs) {super(context, attrs);initializeView();}/** * 初始化控件 */private void initializeView() {if (gifResource != 0) {InputStream is = getContext().getResources().openRawResource(gifResource);byte[] array = streamToBytes(is);mMovie = Movie.decodeByteArray(array, 0, array.length);movieStart = 0;this.invalidate();}}/** * 设置GIF资源ID * * @param id */public void setGIFResource(int id) {this.gifResource = id;initializeView();}/** * 获取资源ID * * @return */public int getGIFResoure() {return gifResource;}/** * 设置GIF资源数据 * * @param bytes */public void setGIFResource(byte[] bytes) {if (bytes == null || bytes.length <= 0) {return;}mMovie = Movie.decodeByteArray(bytes, 0, bytes.length);movieStart = 0;this.invalidate();}/** * 设置GIF资源数据 * * @param is */public void setGIFResource(InputStream is) {if (is == null) {return;}byte[] array = streamToBytes(is);mMovie = Movie.decodeByteArray(array, 0, array.length);movieStart = 0;this.invalidate();}/** * 设置GIF资源图片 * * @param bitmap */public void setGIFResource(Bitmap bitmap) {if (bitmap == null) {return;}ByteArrayOutputStream bos = new ByteArrayOutputStream();bitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos);byte[] bitmapdata = bos.toByteArray();mMovie = Movie.decodeByteArray(bitmapdata, 0, bitmapdata.length);movieStart = 0;this.invalidate();}private static byte[] streamToBytes(InputStream is) {ByteArrayOutputStream os = new ByteArrayOutputStream(1024);byte[] buffer = new byte[1024];int len;try {while ((len = is.read(buffer)) >= 0) {os.write(buffer, 0, len);}} catch (java.io.IOException e) {}return os.toByteArray();}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubcanvas.drawColor(Color.TRANSPARENT);super.onDraw(canvas);long now = android.os.SystemClock.uptimeMillis();if (movieStart == 0) {movieStart = now;}int d = mMovie.duration();if (d <= 0) {d = 1500;}if (mMovie != null) {int relTime = (int) ((now - movieStart) % d);mMovie.setTime(relTime);mMovie.draw(canvas, (getWidth() - mMovie.width()) / 2, (getHeight() - mMovie.height()) / 2);this.invalidate();}}}
特别注意:
使用movie时,你需要把这个控件的硬件加速关闭,否则同样无法播放。貌似硬件加速的属性是3.0以后才有的。
方法是:
gifView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
- android显示gif动态图的方法
- android gif动态图显示
- Android 显示 Gif动态图片的三种常用方法
- android 动态图gif显示俩种方法
- Android显示GIF动态图的三种方式
- 显示GIF动态图
- Gif动态图显示
- Android 显示Gif 动态图片
- c# winform 显示动态gif图片的方法
- c# winform 显示动态gif图片的方法
- c# winform 显示动态gif图片的方法
- c# winform 显示动态gif图片的方法
- Android 显示和控制gif动态图片的播放
- Android 显示gif图
- android显示gif图
- qt显示动态图 gif
- Swift gif动态图显示
- Android 显示Gif动态图和静态图
- Java 通过主线程实现子线程的超时控制
- T_SQL : to execute local .sql file
- Android开发环境配置图文教程(jdk+eclipse+sdk)
- 导入导出Excel
- [转帖]Spring事务,传播行为类型PROPAGATION_REQUIRED
- android显示gif动态图的方法
- javascript中使用setTimeout以不定时执行操作
- struts2 struts.xml配置中常见配置选项及说明
- C#.NET Split 的几种使用方法
- Android按两次返回键退出应用
- redhat5 编译静态的zlib和openssl
- eclipse下axis2创建web service(一)
- easyui获取日期datebox中的值
- Need 64-bit windows support