博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android可拖动缩放视频悬浮窗
阅读量:5090 次
发布时间:2019-06-13

本文共 2472 字,大约阅读时间需要 8 分钟。

直接上图

    

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

一、悬浮窗口

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

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

 

 

转载于:https://www.cnblogs.com/doubleyoujs/p/11495044.html

你可能感兴趣的文章
三层VS控制器
查看>>
函数传递参数的本质
查看>>
Python学习第二篇
查看>>
Python学习第三篇——逻辑判定
查看>>
c++入门之函数指针和函数对象
查看>>
一个数组中同时找到最大/最小值
查看>>
python终端下打印颜色
查看>>
《从Paxos到ZooKeeper 分布式一致性原理与实践》阅读【Leader选举】
查看>>
RPC框架基础概念理解以及使用初体验
查看>>
Visual Studio 代码风格约束
查看>>
Jzoj3170 挑选玩具
查看>>
测试随想
查看>>
JavaWeb_客户端相对/绝对路径和服务器端路径
查看>>
数组中方法some,every , reduce简单方法
查看>>
图形学-剔除
查看>>
人生哲学
查看>>
JAVA调用.NET的WEBSERVICE
查看>>
Selenium+Python浏览器调用:Firefox
查看>>
nohup 详解
查看>>
树莓派实现摄像头监控(使用motion和mjpg-streamer)
查看>>