Kotlin实现可拖动悬浮窗

直接上图


image

image
image

三级缩放和拖动的视频悬浮窗口

一、悬浮窗口创建

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()
}

通过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可能出现异常
    }
}

有用的话帮忙加个星哦,欢迎讨论
传送门

(文章移植自己的博客园:[Android可拖动缩放视频悬浮窗])

你可能感兴趣的:(Kotlin实现可拖动悬浮窗)