最近有公司有一个需求 需要将环信的视频聊天窗口缩小 类似微信那样,可以放大,并且缩小后可以看到文本聊天的窗口。看了环信的代码 发现文本聊天和视频聊天是两个独立的activity,于是想到activity如何能悬浮并且 在他下面的activity能获得焦点,试了几次发现不能实现。后来有想到一种办法 ,这种办法比较笨拙,但是真的实现了,我将视频聊天的逻辑和图文的逻辑写到了一个activity里面,视频聊天的界面采用悬浮窗口,当在聊天界面的时候需要启动视频界面 便将视频的view 添加到windowmanager中,实现悬浮 并且可以改变大小,在小窗口的模式下 还可以发送图文消息。
网盘地址:http://pan.baidu.com/s/1jIcBNfg,希望可以帮到有同样需求的人。
主要代码片段:
/**************************** 视频悬浮窗********************************/ WindowManager mWindowManager; WindowManager.LayoutParams wmParams; public void showFloatWindow() { wmParams = new WindowManager.LayoutParams(); mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; wmParams.format = PixelFormat.RGBA_8888; wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; wmParams.gravity = Gravity.LEFT | Gravity.TOP; wmParams.x = 0; wmParams.y = 0; wmParams.width = ScreenUtil.getScreenWidth(ChatActivity.this); wmParams.height = ScreenUtil.getScreenHeight(ChatActivity.this) - ScreenUtil.getNavigationBottomHeight(ChatActivity.this); viewRootView.setParams(wmParams); viewRootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(isChangefreeState){ changeFloatSize(); isChangefreeState = false; } } }); mWindowManager.addView(viewRootView, wmParams); isAddWindowManager = true; } public void changeFloatSize() { if (!isChangefreeState) { wmParams.x = ScreenUtil.getScreenWidth(ChatActivity.this); wmParams.y = 0; wmParams.width = ScreenUtil.getScreenWidth(ChatActivity.this) / 3; wmParams.height = ScreenUtil.getScreenHeight(ChatActivity.this) / 3; mWindowManager.updateViewLayout(viewRootView, wmParams); callStateTextView.setVisibility(View.INVISIBLE); chronometer.setVisibility(View.INVISIBLE); nickTextView.setVisibility(View.INVISIBLE); switchCameraBtn.setVisibility(View.INVISIBLE); voiceContronlLayout.setVisibility(View.INVISIBLE); hangupBtn.setVisibility(View.INVISIBLE); changeBtn.setVisibility(View.INVISIBLE); } else { wmParams.x = 0; wmParams.y = 0; wmParams.width = ScreenUtil.getScreenWidth(ChatActivity.this); wmParams.height = ScreenUtil.getScreenHeight(ChatActivity.this) - ScreenUtil.getNavigationBottomHeight(ChatActivity.this); mWindowManager.updateViewLayout(viewRootView, wmParams); callStateTextView.setVisibility(View.VISIBLE); chronometer.setVisibility(View.VISIBLE); nickTextView.setVisibility(View.VISIBLE); switchCameraBtn.setVisibility(View.VISIBLE); voiceContronlLayout.setVisibility(View.VISIBLE); hangupBtn.setVisibility(View.VISIBLE); changeBtn.setVisibility(View.VISIBLE); } } public void removeFloatWindow() { if (viewRootView != null && isAddWindowManager) { mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); mWindowManager.removeView(viewRootView); isAddWindowManager = false; } }