订阅多个视图到一个视图onclick和可见性改变RxAndroid

我新使用RxJava,并且仍然熟悉很多概念。 试图在一个项目中使用它,我想要做的是订阅一个视图的点击事件来改变另一个视图的可见性。 这是我的审判工作。

RxView.clicks(info_overlay).map { _ -> View.GONE }.subscribe { AppCache().hasSeenInfoScreen = true info_overlay_child_take_a_helfie.visibility = it info_overlay_child_subscription.visibility = it info_overlay_child_description.visibility = it info_overlay_child_header.visibility = it } 

不过,我也想订阅info_overlay可见性。 这样info_overlay的可见性info_overlay影响其他视图。

我如何实现这一点和点击观察在一起。

最接近的事情是这样的:

  RxView.globalLayouts(info_overlay) .map { info_overlay.visibility } .distinct() .subscribe { newVisibility -> info_overlay.run { (0 until childCount) .map(this::getChildAt) .forEach { view -> view.visibility = newVisibility } } } 

如果您不需要更改所有的子视图使用方法如下:

  RxView.globalLayouts(info_overlay) .map { info_overlay.visibility } .distinct() .subscribe { newVisibility -> info_overlay_child_take_a_helfie.visibility = newVisibility ... } 

解释。 我从这个答案采取了想法https://stackoverflow.com/a/32778292/4727432

 myView.setTag(myView.getVisibility()); myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int newVis = myView.getVisibility(); if((int)myView.getTag() != newVis) { myView.setTag(myView.getVisibility()); //visibility has changed } } }); 

粗略地说,上面的代码和RxView.globalLayouts()是一样的。 之后,我会映射值来查看可见性。 如果可见性发生变化,我已经添加了distinct ,以便只能调用subscribe

没有办法订阅/收听视图的可见性变化,至少不是没有扩展和覆盖。 RxBinding都不提供可观察的。

无论如何,使用kotlin你可以实现这个使用委托,扩展属性和观察它。 但我怀疑这可能是痛苦的,你必须限制在任何地方使用扩展属性来代替visibility