Android 中 Movie 类显示GIF图片

本文详细介绍了如何在Android应用中播放Gif图片,并深入探讨了系统时间获取方法的区别,包括从开机到现在的毫秒数与从1970年至今的毫秒数之间的差异。通过实例代码,展示了如何使用Movie类来管理Gif图片的多个帧,以及如何基于时间间隔来控制Gif的播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Movie类简介

 

2.代码实现

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyGifView(this));
    }

    
    class MyGifView extends View{
        
        //movie管理gif图片里的多个帧
        private Movie movie;
        //表示开始播放gif图片的绝对时间
        private  long movieStart;
        
        public MyGifView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public MyGifView(Context context) {
            super(context);
        
            movie = Movie.decodeStream(getResources().openRawResource(R.drawable.maidi3));
            
        }
        
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            long currentTime = android.os.SystemClock.uptimeMillis();
            
            //第一次播放
            if(movieStart == 0){
                movieStart = currentTime;
            }
            
            //循环播放
            if(movie != null){
                int duration = movie.duration();
                int relTime = (int)((currentTime - movieStart)%duration);
                movie.setTime(relTime);
                movie.draw(canvas,10,20);
//                Paint paint = new Paint();
//                paint.setColor(getResources().getColor(android.R.color.holo_green_light));
//                movie.draw(canvas,10,20, paint);
                invalidate();
            }
        }
        
    }
    
}

 

3.知识点说明

很多情况下,不管是我们自己使用时间间隔来做一些算法,或是调用系统的API,比如动画效果,都会需要基于时间间隔来做,通常做法是:记录开始时间 startTime,然后每次回调时,获取当前时间  currentTime,计算差值 = currentTime - startTime,而获取当前时间,系统提供了两种方法:

SystemClock.uptimeMillis 和 System.currentTimeMillis

这两种方法有何区别呢?

1. SystemClock.uptimeMillis()  // 从开机到现在的毫秒数(手机睡眠的时间不包括在内);

2. System.currentTimeMillis() // 从1970年1月1日 UTC到现在的毫秒数;

但是,第2个时间,是可以通过System.setCurrentTimeMillis修改的,那么,在某些情况下,一但被修改,时间间隔就不准了。

特别说明点:AnimationUtils 中明确说了:

[java]
/**
 * Returns the current animation time in milliseconds. 
 * This time should be used when invoking
 * {@link Animation#setStartTime(long)}. Refer to 
 * {@link android.os.SystemClock} for more
 * information about the different available clocks. 
 * The clock used by this method is
 * <em>not</em> the "wall" clock (it is not 
 * {@link System#currentTimeMillis}).
 *
 * @return the current animation time in milliseconds
 *
 * @see android.os.SystemClock
 */ 

 

转载于:https://www.cnblogs.com/d-on/p/4201768.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值