【问题标题】:Highlight layout after delay?延迟后突出显示布局?
【发布时间】:2009-11-12 22:46:35
【问题描述】:

我已经创建了自己的复合小部件,就像这样:

<LinearLayout>
  <TextView />
  <Button />
</LinearLayout>

我将其中的 15 个放在 ScrollView 中。我希望它的行为类似于 ListView(我不能直接将 ListView 用于此任务)。

我需要每个小部件在按下时突出显示。我已经让它工作了,但它太敏感了——只要我的手指碰到布局,它就会突出显示——我希望在突出显示之前有一个延迟,以区分真正的点击和滚动手势。

例如,在 ListView 中,当您拖动手指进行滚动时,除非您将手指放在行上一秒钟,否则行项不会突出显示。

这就是我设置每个复合项目的背景的方式:

private void setBg() {
  ColorDrawable blr = new ColorDrawable(0xFFFFFFFF);
  Drawable pressed = getContext().getResources().getDrawable(android.R.drawable.list_selector_background);

  StateListDrawable bg = new StateListDrawable();
  bg.addState(View.PRESSED_ENABLED_STATE_SET, pressed);
  bg.addState(View.FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, pressed);
  bg.addState(View.PRESSED_ENABLED_FOCUSED_STATE_SET, pressed);
  bg.addState(View.ENABLED_WINDOW_FOCUSED_STATE_SET, pressed);
  bg.addState(View.ENABLED_STATE_SET, blr);
  bg.addState(View.SELECTED_WINDOW_FOCUSED_STATE_SET, blr);

  setBackgroundDrawable(bg);
}

所以我不确定我是否错误地设置了上述背景可绘制状态之一 - 或者 ListView 是否在内部针对该点击延迟进行了某种触摸处理?

谢谢

【问题讨论】:

  • 我真的非常非常推荐找到一种方法让 ListView 为您工作。让我难以想象的是,沿着你要走的路比使用 ListView 更容易。
  • 我明白 - 我真正关心的是 LsitView 在快速滚动期间可以多快地重新组合各个行。我有复合行,每行都有一个 ImageView、几个 TextView 等 - 必须从图像缓存中获取 ImageView。如果用户快速滚动,我需要从缓存中获取这些图像以重新组合每一行。另一方面,按照我现在的方式,所有行都在前面组合一次(最多 20 行)。不确定是否值得切换。
  • github.com/commonsguy/cwac-sacklist -- 这是一个“适配器”,它简单地保存一袋行视图并为它们提供服务。您不需要仅仅因为要预先创建固定数量的行就避免使用 ListView。
  • 很酷,谢谢,这就像我需要的 99%。我向 cw-android google 小组发布了一个关于它的问题(等待审核)。我有一种情况,我可能想向适配器添加一个视图,它本身是不可聚焦的,但它有两个可聚焦的子按钮。我认为没有办法处理这种情况,我将焦点从父视图转发到布局中的第一个子按钮。如果您有任何很棒的想法,我可能可以解决这个问题,但感谢您的所有帮助!

标签: android android-widget


【解决方案1】:

尝试使用动画或过渡,在触摸时运行动画或过渡开始,在触摸向上或取消时停止或重置。延迟列表中的第一个框架/项目。

http://developer.android.com/guide/topics/graphics/2d-graphics.html#frame-animation

【讨论】:

    【解决方案2】:

    Romain Guy 在 Google IO 2009 上的演讲在类似情况下对我很有帮助:

    Make your Android UI Fast and Efficient(大约 90 秒)

    提到的 ViewHolder 技巧可以极大地提高性能。

    此外,在从缓存加载图像时显示一个临时的 Drawable 可以让您快速滚动,即使图像尚未加载也是如此,然后您可以使用动画(例如)在从缓存返回时淡入图像。

    这似乎是他们在 Android Market 等应用中采用的方法。

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2016-01-26
      • 2016-10-13
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多