Fred__Kang 2018-05-28 11:11 采纳率: 0%
浏览 1399
已结题

发现用movie去播放gif的时候,为什么有些gif的duration是0

Glide太大了,用movie的时候发现了这个问题,因为对gif的格式不了解,不知道是不是因为格式原因还是大小原因导致的。

  • 写回答

3条回答 默认 最新

  • qq_41968175 2018-05-28 13:37
    关注

    Android支持GIF动画,但是如果利用ImageView标签直接写在布局文件中:
    Xml代码 收藏代码
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/animation" />

    程序只能加载GIF动画的第一帧。效果如下:

    如果想要正常播放GIF动画,需要借助Movie实现。写了一个简单示例,程序目录结构如下:

    animation.gif是需要播放的GIF动画。
    MainActivity实现了加载GIF动画的功能。
    Java代码 收藏代码
    public class MainActivity extends Activity {

    private Movie mMovie;   
    private long mMovieStart;  
    /** Called when the activity is first created. */   
    @Override   
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
       setContentView(new CustomGifView(this));   
          }  
    class CustomGifView extends View {  
        public CustomGifView(Context context) {   
            super(context);   
            mMovie = Movie.decodeStream(getResources().openRawResource(   
                    R.drawable.animation));  
        }   
    
        public void onDraw(Canvas canvas) {  
            long now = android.os.SystemClock.uptimeMillis();   
    
            if (mMovieStart == 0) { // first time   
                mMovieStart = now;   
            }   
            if (mMovie != null) {   
    
                int dur = mMovie.duration();   
                if (dur == 0) {   
                    dur = 1000;   
                }   
                int relTime = (int) ((now – mMovieStart) % dur);                  
                mMovie.setTime(relTime);   
                mMovie.draw(canvas, 0, 0);   
                invalidate();   
            }   
        }  
    }  
    

    }

    内部类CustomGifView 利用Movie播放GIF动画。解释一下:
    Java代码 收藏代码
    mMovie = Movie.decodeStream(getResources().openRawResource(R.drawable.animation));

    将GIF动画以文件流的形式转换成Movie。
    Java代码 收藏代码
    public void onDraw(Canvas canvas) {

    long now = android.os.SystemClock.uptimeMillis();

        if (mMovieStart == 0) { // first time   
            mMovieStart = now;   
        }   
        if (mMovie != null) {   
    
            int dur = mMovie.duration();   
            if (dur == 0) {   
                dur = 1000;   
            }   
            int relTime = (int) ((now – mMovieStart) % dur);                  
            mMovie.setTime(relTime);   
            mMovie.draw(canvas, 0, 0);   
            invalidate();   
        }   
    }  
    

    invalidate();作用是刷新当前View,这样onDraw方法重复执行,Movie就能画出GIF动画的每一帧。到此,GIF动画就能正常播放了。

    附上一条资源:http://bigcateasymorse.googlecode.com/svn/trunk/android_gif_demo/

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog