可拖动缩放视频悬浮窗
Posted doubleyoujs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可拖动缩放视频悬浮窗相关的知识,希望对你有一定的参考价值。
直接上图
可进行三级缩放和拖动的视频悬浮窗口
一、悬浮窗口
1.1、创建WindowManager
//创建params,控制大小位置
mParams = WindowManager.LayoutParams()
//悬浮窗口 mWindowManager = application.getSystemService(Context.WINDOW_SERVICE) as WindowManager
//权限要求 mParams.type = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY else WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
1.2创建窗口界面
自定义一个View 包含视频播放控件,关闭控件和缩放控件
1.3添加View
mParams.width = mSmallWidth mParams.height = mSmallHeight mParams.y = mHeight mWindowManager.addView(mVideoView, mParams)
这样就创建一个悬浮窗口,通过控制Params width height控制大小,通过控制Param x、y控制位置
二、视频播放
2.1 VideoVIew播放
直接使用VideoVIew控件进行视频播放
mVideoView.setVideoURI(path)
mVideoView.start()
mVideoView.requestFocus()
mVideoView.setOnCompletionListener
mVideoView.start()
主要本地文件的Uri不是很好获取,目前通过FileProvider获取,直接使用Uri.parse()获取会出现无法找到文件的情况
val uri = FileProvider.getUriForFile(this, "com.js.floatingwindow.fileprovider", File(path))
2.2 SurfaceView播放
SurfaceView+MediaPlayer进行播放,比VideoView复杂一点,但是VideoVIew底层一样的使用这种方式实现
播放使用MediaPlayer,SurfaceView进行图像的展示,通过Player.setDisplay(holder)把两者关联起来,其他和音乐播放区别不大
mPlayer.isLooping = true try mPlayer.setDatSource(path.toString()) catch (e: Exception) mPlayer.prepareAsync() mPlayer.setOnPreparedListener mPlayer.start()
2.3 缩放
放大缩小时,视频需要跟着变化,这个改变方式两者不一样
VideoView比较简单
viewTreeObserver.addOnGlobalLayoutListener
mVideoView.run
holder.setFixedSize(width,height)
requestLayout()
SurfaceView
fun changeVideoSize() try var width: Int = mPlayer.videoWidth var height: Int = mPlayer.videoHeight val surfaceWidth = getWidth() val surfaceHeight = getHeight() val max: Float = Math.max(width / surfaceWidth.toFloat(), height / surfaceHeight.toFloat()) width = Math.ceil((width / max).toDouble()).toInt() height = Math.ceil((height / max).toDouble()).toInt() val params = FrameLayout.LayoutParams(width, height) params.gravity = Gravity.CENTER mVideoView.layoutParams = params mVideoView.invalidate() catch (e: IllegalStateException) //mPlayer可能出现异常
有用的话帮忙加个星哦,欢迎讨论
以上是关于可拖动缩放视频悬浮窗的主要内容,如果未能解决你的问题,请参考以下文章
微信小程序中悬浮窗功能的实现(主要探讨和解决在原生组件上的拖动)
uniapp 悬浮窗插件(在其他应用上层显示) Ba-FloatWindow