Committed by
GitHub
Listen to scroll changes for video sink visibility (#231)
正在显示
1 个修改的文件
包含
14 行增加
和
4 行删除
| @@ -84,10 +84,11 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | @@ -84,10 +84,11 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | ||
| 84 | 84 | ||
| 85 | private val handler = Handler(Looper.getMainLooper()) | 85 | private val handler = Handler(Looper.getMainLooper()) |
| 86 | private val globalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener { | 86 | private val globalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener { |
| 87 | - handler.removeCallbacksAndMessages(null) | ||
| 88 | - handler.postDelayed({ | ||
| 89 | - recalculate() | ||
| 90 | - }, 2000) | 87 | + scheduleRecalculate() |
| 88 | + } | ||
| 89 | + | ||
| 90 | + private val scrollListener = ViewTreeObserver.OnScrollChangedListener { | ||
| 91 | + scheduleRecalculate() | ||
| 91 | } | 92 | } |
| 92 | 93 | ||
| 93 | interface Notifier { | 94 | interface Notifier { |
| @@ -96,6 +97,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | @@ -96,6 +97,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | ||
| 96 | 97 | ||
| 97 | init { | 98 | init { |
| 98 | view.viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener) | 99 | view.viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener) |
| 100 | + view.viewTreeObserver.addOnScrollChangedListener(scrollListener) | ||
| 99 | if (view is Notifier) { | 101 | if (view is Notifier) { |
| 100 | view.viewVisibility = this | 102 | view.viewVisibility = this |
| 101 | } | 103 | } |
| @@ -105,6 +107,13 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | @@ -105,6 +107,13 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | ||
| 105 | private val viewRect = Rect() | 107 | private val viewRect = Rect() |
| 106 | private val windowRect = Rect() | 108 | private val windowRect = Rect() |
| 107 | 109 | ||
| 110 | + private fun scheduleRecalculate() { | ||
| 111 | + handler.removeCallbacksAndMessages(null) | ||
| 112 | + handler.postDelayed({ | ||
| 113 | + recalculate() | ||
| 114 | + }, 2000) | ||
| 115 | + } | ||
| 116 | + | ||
| 108 | fun recalculate() { | 117 | fun recalculate() { |
| 109 | var shouldNotify = false | 118 | var shouldNotify = false |
| 110 | val newVisibility = isVisible() | 119 | val newVisibility = isVisible() |
| @@ -154,6 +163,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | @@ -154,6 +163,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { | ||
| 154 | override fun close() { | 163 | override fun close() { |
| 155 | super.close() | 164 | super.close() |
| 156 | handler.removeCallbacksAndMessages(null) | 165 | handler.removeCallbacksAndMessages(null) |
| 166 | + view.viewTreeObserver.removeOnScrollChangedListener(scrollListener) | ||
| 157 | view.viewTreeObserver.removeOnGlobalLayoutListener(globalLayoutListener) | 167 | view.viewTreeObserver.removeOnGlobalLayoutListener(globalLayoutListener) |
| 158 | if (view is Notifier && view.viewVisibility == this) { | 168 | if (view is Notifier && view.viewVisibility == this) { |
| 159 | view.viewVisibility = null | 169 | view.viewVisibility = null |
-
请 注册 或 登录 后发表评论