Android-从文件中播放动画GIF

时间:2013-04-30 14:13:26

标签: android gif

我已经找到了有关如何通过从资产中读取动画或使用可绘制对象来在Android中播放动画GIF的教程。但我想要的是从SD卡读取一个gif文件。 我已经改变了从资产中读取gif的项目。

在主要活动中,我基本上创建了gifMovieView然后是setContent(gifMovieView) 在GifMovieView类的构造函数中,我已经像项目“eu.andlabs.tutorial.animatedgifs”中那样初始化了Movie对象。但我使用decodeFile给出文件路径而不是decodeStream获取inputStream。

    File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath(),"piggy.gif");

    if(file.exists()){

           mMovie = Movie.decodeFile(file.getPath()); 
   }

我有这条线路的I / O EXCEPTION。它找到了文件,但decodeFile给出了异常。

在onDraw;

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.TRANSPARENT);
    super.onDraw(canvas);
    final long now = SystemClock.uptimeMillis();

    if (mMoviestart == 0) { 
        mMoviestart = now;
    }


    Log.i("",""+mMovie.duration());

    Log.i("",""+mMoviestart);

    final int relTime = (int)((now - mMoviestart) % mMovie.duration());
    mMovie.setTime(relTime);
    mMovie.draw(canvas, 10, 10);
    this.invalidate();
}

由于异常,movie.duration变为0导致错误。

有什么建议吗?

提前谢谢

https://gist.github.com/beyzakokcan/5488897/raw/e9c2afbf941d06ed0f1d3b75dc3d100ff9d7ee85/GifMovieView.java

1 个答案:

答案 0 :(得分:5)

使用动画:

1 - 在Link中提取您的gif并将图像保存在可绘制文件夹中

2 - 在drawable文件夹中创建image_background_animation.xml,其中“img_weel”是从gif中提取的图像:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >

    <item
        android:drawable="@drawable/img_weel_1"
        android:duration="100"/>
    <item
        android:drawable="@drawable/img_weel_2"
        android:duration="100"/>
    <item
        android:drawable="@drawable/img_weel_3"
        android:duration="100"/>

</animation-list>

3 - 在java代码中:

ImageView imgWheel = (ImageView) findViewById(R.id.img_wheel);
imgWheel.setBackgroundResource(R.drawable.image_background_animation);

AnimationDrawable frameAnimation = (AnimationDrawable) imgWheel.getBackground();
frameAnimation.start();

4 - 如果你想要确定动画的时间:

new CountDownTimer(3000, 100) {
 void onFinish() {
    frameAnimation.stop();
  }
}.start();

here