如何强制视图在执行下一行代码之前立即重绘

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (84)

我有一个LinearLayout,我想更改它的一个子视图(一个ImageButton)被单击时的背景色。我能够做到这一点,但不是立即-更改不会发生在屏幕上直到稍后(我认为在一个onResume调用)。我想了解如何在设置背景后,在执行下一行代码之前,强制布局重新绘制。下面是我的OnClickListener按钮的onclick方法:

public void onClick(View v) {

  LinearLayout parentLayout = (LinearLayout) v.getParent();
  parentLayout.setBackgroundResource(R.color.my_color);
  SystemClock.sleep(1000); //ms

}

其中有睡眠命令,以测试重绘是在它之前还是之后发生。结果:事后。关于这个主题的大多数问题(如这儿这儿)说在视图上使用失效()。我使用了命令parentLayout.invalidate();parentLayout.postInvalidate();,和parentLayout.refreshDrawableState();在背景和睡眠线之间,一切都无济于事。重绘仍然发生在睡眠命令之后。有人能告诉我如何立即做到这一点吗?

其他可能有用的信息:LinearLayout绑定到ListView的行,上面的OnClickListener位于扩展SimpleCursorAdapter的自定义类中,而不是在活动本身中。(通过这种方式,我可以为ListView中的每一行设置一个侦听器。)

提问于
用户回答回答于

进行更改并调用listview.invalidate();在UI上反映这些更改

用户回答回答于

我在OnClickLIster中执行可绘制的更改,而我应该在OnTouchListener中执行这些更改。如果我为我的按钮设置了一个OnTouchListener,该按钮可以查找操作,然后在其父布局上运行setBackoundColor,更改将立即发生。

可以在XML中为父布局背景分配一个选择器,然后在上面提到的OnTouchListener中,在该布局上运行setPress(True)。这不是一个很好的解决方案,因为选择器给您的自由比直接在代码中更改视图的属性少得多。例如,您不能通过按不同的按钮将布局背景设置为不同的颜色。

用户回答回答于

你可以试试forceLayout()调用draw(canvas)。如果你没有覆盖onLayout()onMeasure,,,draw()onDraw(),则默认实现将运行。唯一的问题是,要么获得画布,要么手工创建画布。

我们强烈反对采用这种方法,因为Android是专为避免超出常规更新而设计的。虽然你是对的invalidate()不会立即发生,这是鼓励重划的最安全和最好的方式。如果想要处理更新之外的绘图,Android提供了一种使用SurfaceHolder类进行绘图的方法。

扫码关注云+社区

领取腾讯云代金券