Retrofit 을 이용하여 영상 목록을 받아와 구성함
MotionLayout 을 이용하여 유튜브 영상 플레이어 화면 전환 애니메이션을 구현함.
영상 목록을 클릭하여 ExoPlayer 를 이용하여 영상을 재생할 수 있음.
https://velog.io/@dldmswo1209/MotionLayout-이용하여-화면-전환-UI-구성하기
https://velog.io/@dldmswo1209/영상목록-API-만들고-가져오기Retrofit2
영상을 재생시키기 위해서 Google 에서 만든 ExoPlayer 를 사용할 것이다.
https://github.com/google/ExoPlayer
implementation 'com.google.android.exoplayer:exoplayer:2.13.3'
RecyclerView 의 item 클릭 이벤트를 추가하기 위해서 어답터 매개변수로 callback 람다식을 받고 view.setOnclickListener 에서 callback으로 영상 url 과 영상 제목을 전달 한다.
class VideoAdapter(val callback: (String, String) -> Unit) : ListAdapter<VideoModel, VideoAdapter.ViewHolder>(diffUtil) {
inner class ViewHolder(private val view: View): RecyclerView.ViewHolder(view){
fun bind(item: VideoModel){
...
view.setOnClickListener{
callback(item.sources, item.title)
}
}
}
어답터를 생성할 때 다음과 같이 작성해준다.
videoAdapter = VideoAdapter(callback = { url, title->
play(url, title)
})
ExoPlayer 객체 생성하기
private fun initPlayer(){
context?.let {
player = SimpleExoPlayer.Builder(it).build()
}
binding.playerView.player = player
player?.addListener(object: Player.EventListener{
override fun onIsPlayingChanged(isPlaying: Boolean) {
super.onIsPlayingChanged(isPlaying)
if(isPlaying){
binding.bottomPlayerControlButton.setImageResource(R.drawable.ic_baseline_pause_24)
} else{
binding.bottomPlayerControlButton.setImageResource(R.drawable.ic_baseline_play_arrow_24)
}
}
})
}
영상을 재생하는 play() 메소드
fun play(url: String, title: String){
context?.let {
val dataSourceFactory = DefaultDataSourceFactory(it)
val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(MediaItem.fromUri(Uri.parse(url)))
player?.apply {
setMediaSource(mediaSource)
prepare()
play()
}
}
binding.playerMotionLayout.transitionToEnd()
binding.bottomTitleTextView.text = title
}
fragment 생명주기에 따른 player 의 상태(재생 중, 멈춤)를 지정하는 작업을 해줘야 한다. 그렇지 않으면 영상을 재생 중인 상태에서 앱이 background 상태로 넘어가도 영상은 계속 재생되기 때문이다.
해당 프로젝트는 FastCampus의 "30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online" 강의를 수강하면서 만든 프로젝트 입니다.