码迷,mamicode.com
首页 > 其他好文 > 详细

可拖动缩放视频悬浮窗

时间:2019-09-10 00:31:24      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:validate   alt   ide   prepare   ems   一个   path   service   frame   

直接上图

技术图片  技术图片  技术图片

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

一、悬浮窗口

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

    }

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

 传送门

 

 

技术图片

可拖动缩放视频悬浮窗

标签:validate   alt   ide   prepare   ems   一个   path   service   frame   

原文地址:https://www.cnblogs.com/doubleyoujs/p/11495044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!