解決Glide+RecyclerView gif動畫加載后不播放問題


一、概述

  項目中RecyclerView+Glide加載網絡的gif動畫,但是列表中紅gif動畫在華為手機上並不顯示(鴻蒙os),嘗試了很多方法,oppo和小米均正常。最后測試下來是傳入的Context有問題。把Context換成Activity或者Application

  后動畫自動執行了。

  ps:這可能是個特例,還沒找到為甚這樣寫的原因,如果有知道的希望能夠告知。

二、代碼實例

  主要是下面Glide.with(Application/Activity),這樣寫能夠加載成功,如果直接寫context則加載不成功。或者寫view.getContext()也加載不成功。

public void loadNetGif(Context context,String gifPath, ImageView view) {
        Glide.with(context).asGif().load(gifPath).listener(new RequestListener<GifDrawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                view.postDelayed(() -> {
                    Log.e("TAG","莎莎哈啊");
                }, 1);
                return false;
            }

            @Override
            public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                try {
                    Field gifStateField = GifDrawable.class.getDeclaredField("state");
                    gifStateField.setAccessible(true);
                    Class gifStateClass = Class.forName("com.bumptech.glide.load.resource.gif.GifDrawable$GifState");
                    Field gifFrameLoaderField = gifStateClass.getDeclaredField("frameLoader");
                    gifFrameLoaderField.setAccessible(true);
                    Class gifFrameLoaderClass = Class.forName("com.bumptech.glide.load.resource.gif.GifFrameLoader");
                    Field gifDecoderField = gifFrameLoaderClass.getDeclaredField("gifDecoder");
                    gifDecoderField.setAccessible(true);
                    Class gifDecoderClass = Class.forName("com.bumptech.glide.gifdecoder.GifDecoder");
                    Object gifDecoder = gifDecoderField.get(gifFrameLoaderField.get(gifStateField.get(resource)));
                    Method getDelayMethod = gifDecoderClass.getDeclaredMethod("getDelay", int.class);
                    getDelayMethod.setAccessible(true);
                    //設置只播放一次
                    resource.setLoopCount(-1);
                    //獲得總幀數
                    int count = resource.getFrameCount();
                    int delay = 0;
                    for (int i = 0; i < count; i++) {
                        //計算每一幀所需要的時間進行累加
                        delay += (int) getDelayMethod.invoke(gifDecoder, i);
                    }
                    view.postDelayed(() -> {

                    }, delay);
                } catch (NoSuchFieldException e) {

                }catch (ClassNotFoundException e) {

                    e.printStackTrace();
                } catch (IllegalAccessException e) {

                    e.printStackTrace();
                } catch (NoSuchMethodException e) {

                    e.printStackTrace();
                } catch (InvocationTargetException e) {

                    e.printStackTrace();
                }
                return false;
            }
        }).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).into(view);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM