一、概述
項目中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); }
