Android 实现视频的悬浮窗
如微信视频或者斗鱼直播一样,在应用切换到后台后,手机桌面还可以显示一个可以移动的小窗口,播放正在播放的内容。利用的就是android里面的WindowManager,原理逻辑就是在视频界面切换到后台后,调用实现悬浮窗的service服务,在判断了权限后,就可以悬浮在其余应用之上了。先来看效果,点击悬浮窗进入对应的视频播放界面,触摸悬浮窗会移动,点击右键关闭会关闭悬浮窗。
构建悬浮窗的服务
下面的代码就是悬浮窗服务的全部代码。在这个服务中,onCreate定义了这个悬浮窗口的大小、类型等等。onStartCommand接收了该服务启动时接收的播放器路径啊,视频id等等参数。showFloatingWindow是自定义的悬浮窗口,里面包含了我们自己定义的layout布局。布局中用的是七牛的播放控件,因为我的项目是用的七牛的PLVideoTextureView ,这里就根据大家的自己需求来使用自己的合适的播放控件。我这里自定义实现了点击事件View.OnClickListener的一个FloatingOnClickListener;然后也触摸事件View.OnTouchListener的一个FloatingOnTouchListener 。在点击事件中实现了悬浮窗的点击关闭功能,在触摸事件中实现了窗口的移动功能,并且为了解决同一个控件触摸事件与点击事件的冲突,直接在触摸事件的MotionEvent.ACTION_UP中,去处理了窗口的点击事件,这样就不会存在事件的冲突了。
public class FloatingWindowService extends Service {
private WindowManager windowManager;
private WindowManager.LayoutParams layoutParams;
private View display;
private PLVideoTextureView plVideoTextureView;
private ImageView icon_little_close;
private FrameLayout fl_play;
private boolean show=true;
private int qiehuan=0;
private long startTime=0;
private long endTime=0;
private boolean isclick=false;
private String videoPath; //播放路径
private int videoId; //直播间id
public FloatingWindowService() {
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
layoutParams = new WindowManager.LayoutParams();
// 设置图片格式,效果为背景透明
layoutParams.format = PixelFormat.RGB_565;
G.look("悬浮窗 Build.VERSION.SDK_INT" + Build.VERSION.SDK_INT);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
// android 8.0及以后使用
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
// android 8.0以前使用
layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}
layoutParams.gravity = Gravity.LEFT | Gravity.CENTER;
//该flags描述的是窗口的模式,是否可以触摸,可以聚焦等
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 设置视频的播放窗口大小
layoutParams.width = Utils.getWindowScreenWidth(FloatingWindowService.this)/3;
layoutParams.height = Utils.getWindowScreenWidth(FloatingWindowService.this)/3;
layoutParams.x = 700;
layoutParams.y = 0;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (show) {
videoPath = intent.getStringExtra("littlePlayUrl")<