Committed by
GitHub
Fix ScaleZoomHelper to properly handle multiple zoom actions (#429)
正在显示
1 个修改的文件
包含
16 行增加
和
2 行删除
| @@ -23,6 +23,7 @@ import android.view.ScaleGestureDetector | @@ -23,6 +23,7 @@ import android.view.ScaleGestureDetector | ||
| 23 | import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener | 23 | import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener |
| 24 | import androidx.camera.core.Camera | 24 | import androidx.camera.core.Camera |
| 25 | import androidx.camera.core.CameraControl | 25 | import androidx.camera.core.CameraControl |
| 26 | +import com.google.common.util.concurrent.ListenableFuture | ||
| 26 | import io.livekit.android.camerax.ui.ScaleZoomHelper.Companion.createGestureDetector | 27 | import io.livekit.android.camerax.ui.ScaleZoomHelper.Companion.createGestureDetector |
| 27 | import io.livekit.android.room.track.LocalVideoTrack | 28 | import io.livekit.android.room.track.LocalVideoTrack |
| 28 | import io.livekit.android.util.LKLog | 29 | import io.livekit.android.util.LKLog |
| @@ -71,9 +72,17 @@ class ScaleZoomHelper( | @@ -71,9 +72,17 @@ class ScaleZoomHelper( | ||
| 71 | } | 72 | } |
| 72 | } | 73 | } |
| 73 | 74 | ||
| 75 | + /** | ||
| 76 | + * Track the current target zoom, since cameraInfo.zoomState is on LiveData timers and can be out of date. | ||
| 77 | + */ | ||
| 74 | private var targetZoom: Float? = null | 78 | private var targetZoom: Float? = null |
| 75 | 79 | ||
| 76 | /** | 80 | /** |
| 81 | + * Track the current active zoom futures; only clear targetZoom when all futures are completed. | ||
| 82 | + */ | ||
| 83 | + private var activeZoomFutures = mutableSetOf<ListenableFuture<Void>>() | ||
| 84 | + | ||
| 85 | + /** | ||
| 77 | * Scales the current zoom value by [factor]. | 86 | * Scales the current zoom value by [factor]. |
| 78 | * | 87 | * |
| 79 | * This method handles clamping the resulting zoom value to within the camera's | 88 | * This method handles clamping the resulting zoom value to within the camera's |
| @@ -92,12 +101,17 @@ class ScaleZoomHelper( | @@ -92,12 +101,17 @@ class ScaleZoomHelper( | ||
| 92 | 101 | ||
| 93 | if (newZoom != currentZoom) { | 102 | if (newZoom != currentZoom) { |
| 94 | targetZoom = newZoom | 103 | targetZoom = newZoom |
| 95 | - camera.cameraControl.setZoomRatio(newZoom) | ||
| 96 | - .addListener( | 104 | + val future = camera.cameraControl.setZoomRatio(newZoom) |
| 105 | + | ||
| 106 | + activeZoomFutures.add(future) | ||
| 107 | + future.addListener( | ||
| 97 | { | 108 | { |
| 98 | synchronized(this) { | 109 | synchronized(this) { |
| 110 | + activeZoomFutures.remove(future) | ||
| 111 | + if (activeZoomFutures.isEmpty()) { | ||
| 99 | targetZoom = null | 112 | targetZoom = null |
| 100 | } | 113 | } |
| 114 | + } | ||
| 101 | }, | 115 | }, |
| 102 | { it.run() }, | 116 | { it.run() }, |
| 103 | ) | 117 | ) |
-
请 注册 或 登录 后发表评论