我们原有的APP中有视频播放以及投屏的功能,但是投屏只在当前页面起效,一旦退出,投屏就自动失效了。偏偏产品喜欢研究别人家的app,研究了一波之后,对我发出了直击灵魂的疑问:“为什么人家腾讯视频在投屏的时候有个悬浮按钮?”,"为什么人家优酷在投屏的时候有全局悬浮按钮?"
产品指着腾讯视频,终于露出了獠牙:“啊,我不管,我要这个!你要给我做!”。我的内心毫无波动,甚至还有点。。。
哎,好吧,做。
那我们就先来研究一下这个悬浮按钮吧。
如果要在单个Activity内实现一个悬浮按钮,只要你是个Android开发就会做了,那全局的悬浮按钮是不是就是要在左右的Activity中都来做一个这样的按钮呢?
这种思路不是说不可以,但是,太累了,不仅要在左右的activity里加,还要再fragment里面加。
于是,我们就直接把view添加到widnow上,这样就可以挣脱activity和fragment的束缚。那要怎么来添加呢?这就要借助windowmanager了,从名字上就可以看出,windowmanage时window的管理类,它本身包含3个方法,分别对应着增加view,删除view,更新view。
那具体要怎么使用呢?
1.自定义悬浮view 主要用来处理拖动事件,我们的view里面只放了一个图片
public class FloatView extends LinearLayout {
/**
* 系统状态栏高度
*/
private static int statusBarHeight;
/**
* 窗口管理
*/
private WindowManager windowManager;
private WindowManager.LayoutParams layoutParams;
/**
* 点击事件
* @param context
*/
private OnFloatViewClickListener clickListener;
public void setClickListener(OnFloatViewClickListener clickListener) {
this.clickListener = clickListener;
}
public FloatView(Context context) {
this(context, null);
}
public FloatView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public FloatView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater.from(context).inflate(R.layout.window_float_layout, this);
}
public void setLayoutParams(WindowManager.LayoutParams layoutParams) {
this.layoutParams = layoutParams;
}
private void updateWindow() {
layoutParams.x = (int) (xInScreen-xViewScreen);
layoutParams.y = (int) (yInScreen-yViewScreen);
windowManager.updateViewLayout(this,layoutParams);
}
/**
* 点击事件
*/
public void onClick(){
if (clickListener!=null){
clickListener.onClick();
}
}
/**
* 获取状态栏高度
*
* @return
*/
private int getStatusBarHeight() {