• Android可拖动缩放视频悬浮窗


    直接上图

        

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

    一、悬浮窗口

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

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

     传送门

  • 相关阅读:
    ceph(4)--Ceph 的基础数据结构
    ceph(3)--Ceph 物理和逻辑结构
    ceph(2)--Ceph RBD 接口和工具
    ceph(1)--安装和部署
    Ceph中文文档
    Linux系统介绍(五)常用命令
    Linux系统介绍(四)IO重定向与管道
    剑指offer:跳台阶
    剑指offer:斐波那契数列
    剑指offer:旋转数组的最小数字
  • 原文地址:https://www.cnblogs.com/doubleyoujs/p/11495044.html
Copyright © 2020-2023  润新知