Есть два видео: отсканированный багаж и багаж:
Задача , чтобы показать оба видео одновременно перекрывающимися с областью круга, подвижной по экрану касанием:
Я вижу два пути решения:
Way1: поместите рентгеновское видео внизу, оригинальное видео под ним и обрежьте область круга.
Way2: воспроизводить оригинальное видео внизу, создавать круглую поверхность и воспроизводить рентгеновское видео на поверхности
Я выбрал Way1. Для видео 1 используется SurfaceView с резьбой для обработки холста. Видео 2 (рентгеновское изображение), расположенное под SurfaceView с использованием constraintLayout:
class CircleSurfaceView(context: Context, attrs: AttributeSet) : SurfaceView(context, attrs), SurfaceHolder.Callback {
private val drawThread by lazy { DrawThread(holder, resources,context) }
private val player by lazy { MediaPlayer.create(context, R.raw.dl_transhealthytolipid) }
init {
holder.addCallback(this)
}
override fun surfaceCreated(holder: SurfaceHolder?) {
drawThread.setRunning(true)
drawThread.start()
player.setDisplay(holder)
player.isLooping=true
player.start()
this.setBackgroundColor(Color.TRANSPARENT)
}
override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
}
override fun surfaceDestroyed(holder: SurfaceHolder?) {
var isProcessing = true
drawThread.setRunning(false)
while (isProcessing) {
try {
drawThread.join()
isProcessing = false
} catch (e: InterruptedException) {
}
}
}
}
Нить для обрезки холста:
internal class DrawThread(private val surfaceHolder: SurfaceHolder, resources: Resources,context: Context) : Thread() {
private var isProcessing = false
private var previousTime: Long = 0
fun setRunning(run: Boolean) {
isProcessing = run
}
override fun run() {
var canvas: Canvas?
while (isProcessing) {
// Perform the clipping every 30 mS
val now = System.currentTimeMillis()
val elapsedTime = now - previousTime
if (elapsedTime > 30) {
previousTime = now
}
synchronized(surfaceHolder) {
canvas = surfaceHolder.lockCanvas(null)
val clipPath=Path()
//to simplify clipped fixed coordinates circle
clipPath.addCircle(100f,100f,300f,Path.Direction.CW)
canvas!!.clipPath(clipPath)
surfaceHolder.unlockCanvasAndPost(canvas)
}
}
}
}
SurfaceView реализован как cutomView и добавлен в activity_main.xml:
<com.example.customcomponent.CircleSurfaceView
android:id="@+id/circleSurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
Но в результате получается только черный экран.
Вопрос: Как обеспечить наложение двух видео с возможностью перемещения обрезанной области?
(Любой котлин или ява)
Спасибо!