fixed line box

This commit is contained in:
dranik
2026-05-09 17:18:15 +03:00
parent f781bf6a23
commit bf4bf9972d
2 changed files with 39 additions and 20 deletions
@@ -127,7 +127,7 @@ class CameraActivity : ComponentActivity() {
viewBinding.pairingScanOverlay.visibility = View.VISIBLE
viewBinding.pairingChrome.visibility = View.VISIBLE
viewBinding.root.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
onPairingLayoutGeometryChanged()
viewBinding.root.post { onPairingLayoutGeometryChanged() }
}
viewBinding.root.post {
onPairingLayoutGeometryChanged()
@@ -302,11 +302,22 @@ class CameraActivity : ComponentActivity() {
density
)
val torchSizePx = (56f * density).roundToInt().coerceAtLeast(1)
val lp = viewBinding.torchButton.layoutParams as FrameLayout.LayoutParams
lp.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
lp.topMargin = (torchCy - torchSizePx / 2f).roundToInt().coerceAtLeast(0)
lp.bottomMargin = 0
viewBinding.torchButton.layoutParams = lp
val topMargin = (torchCy - torchSizePx / 2f).roundToInt().coerceAtLeast(0)
val wantGravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
viewBinding.torchButton.post {
if (!::viewBinding.isInitialized || !intent.getBooleanExtra(EXTRA_PAIRING_QR_CAMERA, false)) {
return@post
}
val btn = viewBinding.torchButton
val lp = btn.layoutParams as FrameLayout.LayoutParams
if (lp.gravity == wantGravity && lp.topMargin == topMargin && lp.bottomMargin == 0) {
return@post
}
lp.gravity = wantGravity
lp.topMargin = topMargin
lp.bottomMargin = 0
btn.layoutParams = lp
}
}
/** Matches iOS pairing overlay torch on/off chrome (background + golden border). */
@@ -471,16 +482,20 @@ class CameraActivity : ComponentActivity() {
if (intent.getBooleanExtra(EXTRA_PAIRING_QR_CAMERA, false)) {
previewTransformLayoutListener?.let { viewFinder.removeOnLayoutChangeListener(it) }
val layoutListener = View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
scheduleCachedPreviewOutputTransformRefresh()
onPairingLayoutGeometryChanged()
viewFinder.post {
scheduleCachedPreviewOutputTransformRefresh()
onPairingLayoutGeometryChanged()
}
}
previewTransformLayoutListener = layoutListener
viewFinder.addOnLayoutChangeListener(layoutListener)
previewStreamStateObserver?.let { viewFinder.previewStreamState.removeObserver(it) }
val streamObserver = Observer<PreviewView.StreamState> { state ->
if (state == PreviewView.StreamState.STREAMING) {
scheduleCachedPreviewOutputTransformRefresh()
viewFinder.post { onPairingLayoutGeometryChanged() }
viewFinder.post {
scheduleCachedPreviewOutputTransformRefresh()
onPairingLayoutGeometryChanged()
}
}
}
previewStreamStateObserver = streamObserver
@@ -47,6 +47,8 @@ class PairingQrScanOverlayView @JvmOverloads constructor(
private val bracketPaths = arrayOfNulls<Path>(4)
private val dimPath = Path()
private var pairingHeaderBottomPx = 0f
fun setPairingHeaderBottomPx(px: Float) {
@@ -98,16 +100,18 @@ class PairingQrScanOverlayView @JvmOverloads constructor(
super.onDraw(canvas)
val w = width.toFloat()
val h = height.toFloat()
val holeLeft = hole.left
val holeTop = hole.top
val holeRight = hole.right
val holeBottom = hole.bottom
// Four dim rects (same idea as QML dimLayer)
canvas.drawRect(0f, 0f, w, holeTop, dimPaint)
canvas.drawRect(0f, holeBottom, w, h, dimPaint)
canvas.drawRect(0f, holeTop, holeLeft, holeBottom, dimPaint)
canvas.drawRect(holeRight, holeTop, w, holeBottom, dimPaint)
val side = hole.width()
if (side > 0f) {
val d = resources.displayMetrics.density
val rx = PairingQrScanGeometry.pairingIosStyleHoleCornerRadiusPx(side, d)
dimPath.rewind()
dimPath.fillType = Path.FillType.EVEN_ODD
dimPath.addRect(0f, 0f, w, h, Path.Direction.CW)
dimPath.addRoundRect(hole, rx, rx, Path.Direction.CW)
canvas.drawPath(dimPath, dimPaint)
} else {
canvas.drawRect(0f, 0f, w, h, dimPaint)
}
for (i in 0..3) {
bracketPaths[i]?.let { canvas.drawPath(it, bracketPaint) }