Skip to content

Commit c737102

Browse files
committed
fix: some rendering problems when change render widget order
1 parent 2520e7a commit c737102

File tree

2 files changed

+140
-126
lines changed

2 files changed

+140
-126
lines changed

RtcSurfaceView.kt

+81-71
Original file line numberDiff line numberDiff line change
@@ -9,92 +9,102 @@ import io.agora.rtc.video.VideoCanvas
99
import java.lang.ref.WeakReference
1010

1111
class RtcSurfaceView(
12-
context: Context
12+
context: Context
1313
) : FrameLayout(context) {
14-
private var surface: SurfaceView
15-
private var canvas: VideoCanvas
16-
private var channel: WeakReference<RtcChannel>? = null
14+
private var surface: SurfaceView
15+
private var canvas: VideoCanvas
16+
private var isMediaOverlay = false
17+
private var onTop = false
18+
private var channel: WeakReference<RtcChannel>? = null
1719

18-
init {
19-
try {
20-
surface = RtcEngine.CreateRendererView(context)
21-
} catch (e: UnsatisfiedLinkError) {
22-
throw RuntimeException("Please init RtcEngine first!")
23-
}
24-
canvas = VideoCanvas(surface)
25-
addView(surface)
20+
init {
21+
try {
22+
surface = RtcEngine.CreateRendererView(context)
23+
} catch (e: UnsatisfiedLinkError) {
24+
throw RuntimeException("Please init RtcEngine first!")
2625
}
26+
canvas = VideoCanvas(surface)
27+
addView(surface)
28+
}
2729

28-
fun setZOrderMediaOverlay(isMediaOverlay: Boolean) {
29-
try {
30-
removeView(surface)
31-
surface.setZOrderMediaOverlay(isMediaOverlay)
32-
addView(surface)
33-
} catch (e: Exception) {
34-
e.printStackTrace()
35-
}
30+
fun setZOrderMediaOverlay(isMediaOverlay: Boolean) {
31+
this.isMediaOverlay = isMediaOverlay
32+
try {
33+
removeView(surface)
34+
surface.setZOrderMediaOverlay(isMediaOverlay)
35+
addView(surface)
36+
} catch (e: Exception) {
37+
e.printStackTrace()
3638
}
39+
}
3740

38-
fun setZOrderOnTop(onTop: Boolean) {
39-
try {
40-
removeView(surface)
41-
surface.setZOrderOnTop(onTop)
42-
addView(surface)
43-
} catch (e: Exception) {
44-
e.printStackTrace()
45-
}
41+
fun setZOrderOnTop(onTop: Boolean) {
42+
this.onTop = onTop
43+
try {
44+
removeView(surface)
45+
surface.setZOrderOnTop(onTop)
46+
addView(surface)
47+
} catch (e: Exception) {
48+
e.printStackTrace()
4649
}
50+
}
4751

48-
fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) {
49-
this.channel = if (channel != null) WeakReference(channel) else null
50-
canvas.channelId = this.channel?.get()?.channelId()
51-
canvas.uid = uid
52-
setupVideoCanvas(engine)
53-
}
52+
fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) {
53+
this.channel = if (channel != null) WeakReference(channel) else null
54+
canvas.channelId = this.channel?.get()?.channelId()
55+
canvas.uid = uid
56+
setupVideoCanvas(engine)
57+
}
5458

55-
fun resetVideoCanvas(engine: RtcEngine) {
56-
val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode)
57-
if (canvas.uid == 0) {
58-
engine.setupLocalVideo(canvas)
59-
} else {
60-
engine.setupRemoteVideo(canvas)
61-
}
59+
fun resetVideoCanvas(engine: RtcEngine) {
60+
val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode)
61+
if (canvas.uid == 0) {
62+
engine.setupLocalVideo(canvas)
63+
} else {
64+
engine.setupRemoteVideo(canvas)
6265
}
66+
}
6367

64-
private fun setupVideoCanvas(engine: RtcEngine) {
65-
if (canvas.uid == 0) {
66-
engine.setupLocalVideo(canvas)
67-
} else {
68-
engine.setupRemoteVideo(canvas)
69-
}
68+
private fun setupVideoCanvas(engine: RtcEngine) {
69+
removeAllViews()
70+
surface = RtcEngine.CreateRendererView(context.applicationContext)
71+
surface.setZOrderMediaOverlay(isMediaOverlay)
72+
surface.setZOrderOnTop(onTop)
73+
addView(surface)
74+
canvas.view = surface
75+
if (canvas.uid == 0) {
76+
engine.setupLocalVideo(canvas)
77+
} else {
78+
engine.setupRemoteVideo(canvas)
7079
}
80+
}
7181

72-
fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) {
73-
canvas.renderMode = renderMode
74-
setupRenderMode(engine)
75-
}
82+
fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) {
83+
canvas.renderMode = renderMode
84+
setupRenderMode(engine)
85+
}
7686

77-
fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) {
78-
canvas.mirrorMode = mirrorMode
79-
setupRenderMode(engine)
80-
}
87+
fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) {
88+
canvas.mirrorMode = mirrorMode
89+
setupRenderMode(engine)
90+
}
8191

82-
private fun setupRenderMode(engine: RtcEngine) {
83-
if (canvas.uid == 0) {
84-
engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode)
85-
} else {
86-
channel?.get()?.let {
87-
it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
88-
return@setupRenderMode
89-
}
90-
engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
91-
}
92+
private fun setupRenderMode(engine: RtcEngine) {
93+
if (canvas.uid == 0) {
94+
engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode)
95+
} else {
96+
channel?.get()?.let {
97+
it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
98+
return@setupRenderMode
99+
}
100+
engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
92101
}
102+
}
93103

94-
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
95-
val width: Int = MeasureSpec.getSize(widthMeasureSpec)
96-
val height: Int = MeasureSpec.getSize(heightMeasureSpec)
97-
surface.layout(0, 0, width, height)
98-
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
99-
}
104+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
105+
val width: Int = MeasureSpec.getSize(widthMeasureSpec)
106+
val height: Int = MeasureSpec.getSize(heightMeasureSpec)
107+
surface.layout(0, 0, width, height)
108+
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
109+
}
100110
}

RtcTextureView.kt

+59-55
Original file line numberDiff line numberDiff line change
@@ -9,72 +9,76 @@ import io.agora.rtc.video.VideoCanvas
99
import java.lang.ref.WeakReference
1010

1111
class RtcTextureView(
12-
context: Context
12+
context: Context
1313
) : FrameLayout(context) {
14-
private var texture: TextureView
15-
private var canvas: VideoCanvas
16-
private var channel: WeakReference<RtcChannel>? = null
14+
private var texture: TextureView
15+
private var canvas: VideoCanvas
16+
private var channel: WeakReference<RtcChannel>? = null
1717

18-
init {
19-
try {
20-
texture = RtcEngine.CreateTextureView(context)
21-
} catch (e: UnsatisfiedLinkError) {
22-
throw RuntimeException("Please init RtcEngine first!")
23-
}
24-
canvas = VideoCanvas(texture)
25-
addView(texture)
18+
init {
19+
try {
20+
texture = RtcEngine.CreateTextureView(context)
21+
} catch (e: UnsatisfiedLinkError) {
22+
throw RuntimeException("Please init RtcEngine first!")
2623
}
24+
canvas = VideoCanvas(texture)
25+
addView(texture)
26+
}
2727

28-
fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) {
29-
this.channel = if (channel != null) WeakReference(channel) else null
30-
canvas.channelId = this.channel?.get()?.channelId()
31-
canvas.uid = uid
32-
setupVideoCanvas(engine)
33-
}
28+
fun setData(engine: RtcEngine, channel: RtcChannel?, uid: Int) {
29+
this.channel = if (channel != null) WeakReference(channel) else null
30+
canvas.channelId = this.channel?.get()?.channelId()
31+
canvas.uid = uid
32+
setupVideoCanvas(engine)
33+
}
3434

35-
fun resetVideoCanvas(engine: RtcEngine) {
36-
val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode)
37-
if (canvas.uid == 0) {
38-
engine.setupLocalVideo(canvas)
39-
} else {
40-
engine.setupRemoteVideo(canvas)
41-
}
35+
fun resetVideoCanvas(engine: RtcEngine) {
36+
val canvas = VideoCanvas(null, canvas.renderMode, canvas.channelId, canvas.uid, canvas.mirrorMode)
37+
if (canvas.uid == 0) {
38+
engine.setupLocalVideo(canvas)
39+
} else {
40+
engine.setupRemoteVideo(canvas)
4241
}
42+
}
4343

44-
private fun setupVideoCanvas(engine: RtcEngine) {
45-
if (canvas.uid == 0) {
46-
engine.setupLocalVideo(canvas)
47-
} else {
48-
engine.setupRemoteVideo(canvas)
49-
}
44+
private fun setupVideoCanvas(engine: RtcEngine) {
45+
removeAllViews()
46+
texture = RtcEngine.CreateTextureView(context.applicationContext)
47+
addView(texture)
48+
canvas.view = texture
49+
if (canvas.uid == 0) {
50+
engine.setupLocalVideo(canvas)
51+
} else {
52+
engine.setupRemoteVideo(canvas)
5053
}
54+
}
5155

52-
fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) {
53-
canvas.renderMode = renderMode
54-
setupRenderMode(engine)
55-
}
56+
fun setRenderMode(engine: RtcEngine, @Annotations.AgoraVideoRenderMode renderMode: Int) {
57+
canvas.renderMode = renderMode
58+
setupRenderMode(engine)
59+
}
5660

57-
fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) {
58-
canvas.mirrorMode = mirrorMode
59-
setupRenderMode(engine)
60-
}
61+
fun setMirrorMode(engine: RtcEngine, @Annotations.AgoraVideoMirrorMode mirrorMode: Int) {
62+
canvas.mirrorMode = mirrorMode
63+
setupRenderMode(engine)
64+
}
6165

62-
private fun setupRenderMode(engine: RtcEngine) {
63-
if (canvas.uid == 0) {
64-
engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode)
65-
} else {
66-
channel?.get()?.let {
67-
it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
68-
return@setupRenderMode
69-
}
70-
engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
71-
}
66+
private fun setupRenderMode(engine: RtcEngine) {
67+
if (canvas.uid == 0) {
68+
engine.setLocalRenderMode(canvas.renderMode, canvas.mirrorMode)
69+
} else {
70+
channel?.get()?.let {
71+
it.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
72+
return@setupRenderMode
73+
}
74+
engine.setRemoteRenderMode(canvas.uid, canvas.renderMode, canvas.mirrorMode)
7275
}
76+
}
7377

74-
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
75-
val width: Int = MeasureSpec.getSize(widthMeasureSpec)
76-
val height: Int = MeasureSpec.getSize(heightMeasureSpec)
77-
texture.layout(0, 0, width, height)
78-
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
79-
}
78+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
79+
val width: Int = MeasureSpec.getSize(widthMeasureSpec)
80+
val height: Int = MeasureSpec.getSize(heightMeasureSpec)
81+
texture.layout(0, 0, width, height)
82+
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
83+
}
8084
}

0 commit comments

Comments
 (0)