GIF在某些gif图片上播放较慢

问题描述:

我正在使用Glide库将gif文件加载到我的应用程序中。这里我实现了:GIF在某些gif图片上播放较慢

GlideDrawableImageViewTarget imageViewPreview = new GlideDrawableImageViewTarget(gifSplach); 
    Glide.with(this) 
      .load("http://i.imgur.com/Cpw2pk6.gif") 
      .listener(new RequestListener<String, GlideDrawable>() { 
       @Override 
       public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 


        return false; 
       } 

       @Override 
       public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 

        //Toast.makeText(activity, ""+e.getMessage(), Toast.LENGTH_SHORT).show(); 

        return false; 
       } 
      }) 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 

      .into(imageViewPreview); 

但由于某些原因gif文件加载非常慢的帧。我试图谷歌,但我无法弄清楚。我使用的Glide版本3.7.0

+0

也许是因为它下载速度慢?尝试预先下载它并将其放入资产中,然后从资产中播放它 –

+1

我的.gif内存大小为5 MB,即使从资产/原始文件夹中获取也很慢。 –

+0

您的'.gif'大小为5.2 MB,这可能是慢帧速率背后的原因 –

你不需要任何库,只需使用此代码: 步骤1

public class GifView extends View { 
public Movie mMovie; 
    public long movieStart; 
private int gifId; 

public GifView(Context context) { 
super(context); 
} 

    public GifView(Context context, AttributeSet attrs) { 
super(context, attrs); 

initializeView(attrs.getAttributeResourceValue 
("http://schemas.android.com/apk/r 
    es-auto", "src", 0)); 
} 

    public GifView(Context context, AttributeSet attrs, int defStyle) { 
super(context, attrs, defStyle); 


initializeView(attrs.getAttributeResourceValue(
"http://schemas.android.com/apk/ 
    res-auto", "src", 0)); 
} 

private void initializeView(final int id) { 
InputStream is = getContext().getResources().openRawResource(id); 
mMovie = Movie.decodeStream(is); 
this.gifId = id; 
} 

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

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

if (mMovie != null) { 
    int relTime = (int) ((now - movieStart) % mMovie.duration()); 
    mMovie.setTime(relTime); 
    mMovie.draw(canvas, getWidth() - mMovie.width(), getHeight() - 
    mMovie.height()); 
    this.invalidate(); 
    } 
    } 

     public void setGIFResource(int resId) { 
    this.gifId = resId; 
    initializeView(this.gifId); 
    } 

    public int getGIFResource() { 
    return this.gifId; 
    } 
    } 

第2步:添加以下在res/ATTRS线.XML

<declare-styleable name="GIFView"> 
<attr name="src" format="reference" /> 
</declare-styleable> 

3步:添加此行的AndroidManifest.xml比活性

android:hardwareAccelerated="false" 

第4步:建立在XML这样的观点:

<com.thigale.testproject.GifView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
components:src="@drawable/loading" /> 

步骤5在你创建的视图的父活动,加上下面几行:

xmlns:components="http://schemas.android.com/apk/res-auto" 

我减小了.gif的大小并从drawable中加载它。它会为我工作。

GlideDrawableImageViewTarget imageViewPreview = new GlideDrawableImageViewTarget(gifSplach); 
Glide.with(this) 
     .load(R.drawable.gif_splash) 
     .listener(new RequestListener<String, GlideDrawable>() { 
      @Override 
      public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 


       return false; 
      } 

      @Override 
      public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 

       //Toast.makeText(activity, ""+e.getMessage(), Toast.LENGTH_SHORT).show(); 

       return false; 
      } 
     }) 
     .diskCacheStrategy(DiskCacheStrategy.ALL) 

     .into(imageViewPreview); 
+0

好兄弟它的帧速率取决于它的大小 – Ahmad