@@ -9,92 +9,102 @@ import io.agora.rtc.video.VideoCanvas
9
9
import java.lang.ref.WeakReference
10
10
11
11
class RtcSurfaceView (
12
- context : Context
12
+ context : Context
13
13
) : 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
17
19
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!" )
26
25
}
26
+ canvas = VideoCanvas (surface)
27
+ addView(surface)
28
+ }
27
29
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()
36
38
}
39
+ }
37
40
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()
46
49
}
50
+ }
47
51
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
+ }
54
58
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)
62
65
}
66
+ }
63
67
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)
70
79
}
80
+ }
71
81
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
+ }
76
86
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
+ }
81
91
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)
92
101
}
102
+ }
93
103
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
+ }
100
110
}
0 commit comments