3

在处理许多滚动图像时,您必须避免在浏览时加载问题,而用户正在快速滚动。最简单且通常最好的解决方案非常简单:

在做任何事情之前引入一个小的延迟(比如 0.350)

如果图像已经在缓存中,只需加载它。否则,请稍等 - 然后完全正常进行。

对于宏伟的毕加索,令人沮丧的是,它看起来就像有一个叉子,实际上就是这样做的,它有一个“withDelay”选项**(参见https://github.com/square/picasso/issues/248

我害怕叉子。

但是是否有可能在毕加索中做到这一点,也许使用自定义的“目标”?所以,

我普通的毕加索电话(在 getView 结束时......)

Picasso.
  with(State.mainContext).
  load(imageFile.getUrl()).
  placeholder(R.drawable.default).
  noFade().
  into(v.im);

而我想我想要这样东西......

Picasso.
  with(State.mainContext).
  load(imageFile.getUrl()).
  placeholder(R.drawable.default).
  noFade().
  into(new Target()
     {
     simply wait .350 before proceeding completely normally...
     });

我做不到,有人能做到吗?

4

2 回答 2

10

编辑:

显然,Square 的人刚刚开始着手推进他们的工作。 https://github.com/square/picasso/pull/665

所以 Lucasr 接管并重新组织了一些代码。现在暂停/恢复可以分组完成,所有请求都有一个DEFAULT_GROUP,显然 ScrollListener 的想法被抛弃了,因为它对他们来说太简单了,但它与 @a.bertucci 发布的代码相同。

public class SampleScrollListener implements AbsListView.OnScrollListener {
  private final Context context;
  private static final Object scrollTag = new Object(); // this can be static or not, depending what u want to achieve

  public SampleScrollListener(Context context) {
    this.context = context;
  }

  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    final Picasso picasso = Picasso.with(context);
    if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
      picasso.resumeTag(scrollTag);
    } else {
      picasso.pauseTag(scrollTag);
    }
  }

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                       int totalItemCount) {
    // Do nothing.
  }
}

这个实现的想法是你显然会用上下文标记你的请求,但你可以很容易地用默认或自定义标记进行标记。

原答案:

Picasso 上已经有此功能的 PullRequest:https ://github.com/square/picasso/pull/561

这与您的建议有点不同,但效果很好(我在我的应用程序上使用)。您可以选择暂停/恢复将图像分派到 ImageViews 并使用 anonScrollListener来暂停和恢复它。

它的代码很简单:

listView.setOnScrollListener(new PicassoScrollListener(context));

我同意分叉很烦人,因为它们可能会过时,但可以自己分叉,并保持最新状态,直到它被合并到毕加索上。

  • 叉毕加索原版
  • 将此添加为远程https://github.com/sockeqwe/picasso并获取它
  • 从 picasso/master 中创建您的分支,然后从 sockeqwe/picasso 中挑选 10 个提交
  • 随心所欲地拉毕加索/大师

这并不理想,但是编程已经为您完成并且运行良好。

或者,您可以使用我的应用程序分支compile 'com.eyeem.picasso:picasso:2.3.3-SNAPSHOT'并密切关注该拉取请求,直到它被合并并恢复。

于 2014-09-20T16:00:11.283 回答
6

暂停/恢复请求的功能将成为 Picasso 2.4 下一个版本的一部分 就在昨天,包含此功能的拉取请求已合并到主分支中。它允许轻松定义一个滚动侦听器,该侦听器在投掷时暂停/恢复 Picasso,如下面报告的示例代码所示:

public class SampleScrollListener implements AbsListView.OnScrollListener {
  private final Context context;

  public SampleScrollListener(Context context) {
    this.context = context;
  }

  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    final Picasso picasso = Picasso.with(context);
    if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
      picasso.resumeTag(context);
    } else {
      picasso.pauseTag(context);
    }
  }

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                       int totalItemCount) {
    // Do nothing.
  }
}
于 2014-09-23T23:22:44.637 回答