如何显示GIF文件

3

我正在使用这个来显示一个'gif'文件。当我使用保存在drawable中的gif时,它可以正确地显示。我像这样调用它:

<pl.droidsonroids.gif.GifImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imgView1"
    android:src="@drawable/gifFile"
    />

但是当移除src并像这样在Activity中初始化GifImageView时

 GifImageView gifFromFile = (GifImageView) findViewById(R.id.imgView1);
gifFromFile.setImageBitmap(Utils.getBitmapImagefromStorage(context, imageHome));

在这里,getBitmapImagefromStorage 获取路径,而 imageHome 则获取文件名。但是当 gif 文件被显示时,它并不会播放,只是像普通的图片一样展示。有人说过:如果给定的 drawable 不是 GIF,则提到的 Views 的效果就像普通的 ImageView 和 ImageButton。 但是我提供的文件是个 gif,所以我想知道我是否在正确地使用它。

此外,这个文件可以是 png 或者 gif,所以我需要支持这两种格式。


这可以帮助您:https://dev59.com/z2w15IYBdhLWcg3wkMjz - Vibhor Chopra
我不太了解你正在使用的库,但你也可以尝试这个:https://github.com/koush/ion - Shrenik Shah
@cricket_007 抱歉,我打错了。 - natsumiyu
3个回答

1
GifTextView gifImageView;

在 onCreate 方法中
gifImageView = (GifTextView) findViewById(R.id.imageView);

在onCreate中调用此方法。
public void playGif(){
        Animation fadeout = new AlphaAnimation(1.f, 1.f);
        fadeout.setDuration(2500); // You can modify the duration here
        fadeout.setAnimationListener(new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                gifImageView.setBackgroundResource(R.drawable.gif_image);//your gif file
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {

            }
        });
        gifImageView.startAnimation(fadeout);
    }

在你的布局文件中。
<pl.droidsonroids.gif.GifTextView
        android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:scaleType="fitXY"
        android:layout_height="fill_parent"
        />

将您的位图转换为可绘制对象,然后设置它。请参考:https://dev59.com/YXE95IYBdhLWcg3wMrAB - nishith kumar
使用Drawable d = new BitmapDrawable(getResources(), yourBitmap); 然后将d用作drawable并将其设置为imageView。 - nishith kumar
不要,如果您正在活动中,请使用getResources()。 - nishith kumar
我该如何在 setBackgroundResource() 中调用 d - natsumiyu
它可以显示Gif,但是无法播放。 - natsumiyu
显示剩余4条评论

0

尝试这种方法在你的应用程序中处理GIF

public class PlayGifView extends View{

     private static final int DEFAULT_MOVIEW_DURATION = 1000;

     private int mMovieResourceId;
     private Movie mMovie;

     private long mMovieStart = 0;
     private int mCurrentAnimationTime = 0;

     @SuppressLint("NewApi")
     public PlayGifView(Context context, AttributeSet attrs) {
         super(context, attrs);

        /**
         * Starting from HONEYCOMB have to turn off HardWare acceleration to draw
         * Movie on Canvas.
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    }

     public void setImageResource(int mvId){
         this.mMovieResourceId = mvId;
    mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId));
    requestLayout();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if(mMovie != null){
        setMeasuredDimension(mMovie.width(), mMovie.height());
    }else{
        setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
    }
}

@Override
protected void onDraw(Canvas canvas) {
    if (mMovie != null){
        updateAnimtionTime();
        drawGif(canvas);
        invalidate();
    }else{
        drawGif(canvas);
    }
}

private void updateAnimtionTime() {
    long now = android.os.SystemClock.uptimeMillis();

    if (mMovieStart == 0) {
        mMovieStart = now;
    }
    int dur = mMovie.duration();
    if (dur == 0) {
        dur = DEFAULT_MOVIEW_DURATION;
    }
    mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);
}

private void drawGif(Canvas canvas) {
    mMovie.setTime(mCurrentAnimationTime);
    mMovie.draw(canvas, 0, 0);
    canvas.restore();
}

}

在你的活动类中

PlayGifView pGif = (PlayGifView) findViewById(R.id.viewGif);
pGif.setImageResource(R.drawable.yourgifimage);

然后在你的XML中

<YourPackageName.PlayGifView
            android:id="@+id/viewGif"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

我得到了这个错误信息:java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Movie.setTime(int)' on a null object reference,位于......drawGif(GifImageView.java:85)。 - Raluca Lucaci
@RalucaLucaci 在哪一行? - Aditya Vyas-Lakhan

0

我尝试使用GifDrawable

File gifFile = new File(context.getExternalFilesDir(null)
                    .getAbsolutePath(), imageHome);
GifDrawable gifFromPath  = new GifDrawable(gifFile);

然后我使用 setImageDrawable 而不是 setImageBitmap

GifImageView gifImageView = (GifImageView) findViewById(R.id.textViewDealFinder);
        gifImageView.setImageDrawable(gifFromPath);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接