用Movie显示gif(1)SimpleGif

 

代码如下:

复制代码
 1 import android.content.Context;
 2 import android.graphics.Canvas;
 3 import android.graphics.Movie;
 4 import android.os.Build;
 5 import android.util.AttributeSet;
 6 import android.view.View;
 7 
 8 import com.e.weixin.R;
 9 
10 public class SimpleGif extends View {
11 
12     private Movie movie;        //播放动画的类
13     private long firstFrame;    //第1帧的时间
14 
15     public int gifId;           //gif的res
16     public int times;           //循环次数
17     public int currentFrame;    //当前播放到第几帧
18     public int duration;        //动画时长
19 
20 
21     public SimpleGif(Context context, AttributeSet attrs) {
22         super(context, attrs);
23         boolean b = isHardwareAccelerated();
24         //在有的版本上要关闭硬件加速才显示动画,
25         //也可以在manifest.xml的application,activity等元素下用android:hardwareAccelerated="false" 关闭硬件加速。
26         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
27             setLayerType(View.LAYER_TYPE_SOFTWARE, null);
28         }
29         b = isHardwareAccelerated();
30         gifId = R.raw.tsj01;
31         //构造一个movie
32         movie = Movie.decodeStream(getResources().openRawResource(gifId));
33         duration = movie.duration();//动画的总共时长
34         if (duration == 0) { //设置一个默认时间
35             duration = 1000;
36         }
37         times = 1;
38     }
39 
40     public void onDraw(Canvas canvas) {
41 
42         //绘制第1步,取得当前时间
43         long now = android.os.SystemClock.uptimeMillis();
44 
45         //记录第1帧的时间
46         if (firstFrame == 0) {// first time
47             firstFrame = now;
48         }
49 
50         if (movie != null) {
51             //如果循环次数不为0就断续绘制。
52             if (times > 0) {
53                 //计算当前帧的时间
54                 currentFrame = (int) (now - firstFrame);
55                 //如果当前帧大于时长,就说明是新循环开始
56                 if (currentFrame > duration){
57                     --times;//循环次数减1
58                     firstFrame = now;
59                     //计算在动画时长内的帧。
60                     currentFrame %= duration;
61                     System.out.println(" 倒数第  " + times + "");
62                 }
63                 //设置当前绘制的帧
64                 movie.setTime(currentFrame);
65 
66                 //开始绘制动画的当前帧
67                 movie.draw(canvas, 0, 0);
68 
69                 //刷新,绘制下1帧
70                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
71                     postInvalidateOnAnimation();
72                 } else {
73                     invalidate();
74                 }
75             }else{
76                 movie.setTime(0);//设置绘制第0帧
77                 movie.draw(canvas, 0, 0);//绘制
78             }
79         }
80     }
81 
82 }
复制代码

 

posted @   f9q  阅读(227)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示