代码之家  ›  专栏  ›  技术社区  ›  Cristian Holdunu

使用RetainingDataSourceSupplier播放动画图像

  •  7
  • Cristian Holdunu  · 技术社区  · 7 年前

    RecyclerView

    如果我在同一个文件中加载另一个GIF DraweeView 内容将消失,因为这是壁画的工作方式,用户将看到一个黑色的图像,而高分辨率的加载,虽然我已经有一个低质量的预览可用。

    后来我发现 RetainingDataSourceSupplier 在壁画中,通过将当前图像保持在 抽屉视图

    2 回复  |  直到 7 年前
        1
  •  3
  •   Cristian Holdunu    7 年前

    我最后重写了壁画的一些部分。基本上, RetainingDataSource 正在破解 DataSource ,保持状态 PROGRESS 数据来源 他们永远也玩不到礼物。

    我通过修改fresco lib代码来解决这个问题,并在每次加载资源后通知控制器。我对壁画做了公关,也许他们会同意我认为 保留数据源 不完整。

    Proper support for GIFs when using a RetainingDataSource

        2
  •  0
  •   Nirmal Code    7 年前

    我以前从没用过fesco。但我认为这会奏效的。

    首先加载低分辨率gif,然后启动一个timertask,以确定是否使用布尔值加载gif。

    final boolean gifLoaded = false;
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(gifLoaded){
                            timer.cancel();
                            //animate your gif
                        }
                    }
                });
            }
        };
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(timerTask,0,200); //check for the gifLoaded value continuously
    

    您可以使用,

    ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
    @Override
    public void onFinalImageSet(
        String id,
        @Nullable ImageInfo imageInfo,
        @Nullable Animatable anim) {
        if (anim != null) {
          //now the gif is loaded
          gifLoaded = true;
          anim.start();
        }
      }
    };
    
     Uri uri;
     DraweeController controller = Fresco.newDraweeControllerBuilder()
        .setUri(uri)
        .setControllerListener(controllerListener)
         // other setters
        .build();
     mSimpleDraweeView.setController(controller);
    

    Fresco : Animated Images