1. 需要获得焦点,点击,输入等,代码如下:
public abstract class SystemWindowWidget {
private Context mContext;
private WindowManager mSysWindowMgr;
private WindowManager.LayoutParams mLytParams;
private View mContentView;
public SystemWindowWidget(Context context){
mContext = context;
mSysWindowMgr = (WindowManager) mContext.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
mLytParams = new WindowManager.LayoutParams();
if(VERSION.SDK_INT < 26){
mLytParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}else{
mLytParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}
mLytParams.format = PixelFormat.TRANSLUCENT;
mLytParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
mLytParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
onCreateView();
}
public Context getWidgetContext(){
return mContext;
}
abstract protected void onCreateView();
protected void setContentView(int resid, int width, int height, int gravity){
mContentView = LayoutInflater.from(mContext).inflate(resid, null);
clipViewCornerByDp(mContentView, 10);
mLytParams.width = width;
mLytParams.height = height;
mLytParams.gravity = gravity;
}
protected void setContentView(View view, int width, int height, int gravity){
mContentView = view;
clipViewCornerByDp(mContentView, 10);
mLytParams.width = width;
mLytParams.height = height;
mLytParams.gravity = gravity;
}
public void showWidget(){
if(mContentView != null){
mSysWindowMgr.addView(mContentView, mLytParams);
}
}
public void removeWidget(){
if(mContentView != null){
try{
mSysWindowMgr.removeView(mContentView);
}catch(IllegalArgumentException e){
e.printStackTrace();
}
}
}
public View findViewById(int id){
View child = null;
if(mContentView != null){
child = mContentView.findViewById(id);
}
return child;
}
int bigWinW = 0, bigWinH = 0, bigWinG = 0, bigX = 0, bigY = 0;
public void minimizingWindow(int width, int height){
bigWinW = mLytParams.width;
bigWinH = mLytParams.height;
bigWinG = mLytParams.gravity;
bigX = mLytParams.x;
bigY = mLytParams.y;
mLytParams.width = width;
mLytParams.height = height;
mLytParams.gravity = Gravity.RIGHT|Gravity.BOTTOM;
mLytParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mSysWindowMgr.updateViewLayout(mContentView, mLytParams);
}
public void restoreWindow(){
mLytParams.width = bigWinW;
mLytParams.height = bigWinH;
mLytParams.gravity = bigWinG;
mLytParams.x = bigX;
mLytParams.y = bigY;
mLytParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
mSysWindowMgr.updateViewLayout(mContentView, mLytParams);
}
public void moveWindow(int xMoved, int yMoved){
mLytParams.x += xMoved;
mLytParams.y += yMoved;
mSysWindowMgr.updateViewLayout(mContentView, mLytParams);
}
private static void clipViewCornerByDp(View view, final int pixel) {
view.setClipToOutline(true);
view.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), pixel);
}
});
}
}
2. 如果不需要获得焦点,还对窗口层级要求较高,构造函数可以按如下方式写:
public SystemWindowView(Context context){
mContext = context;
mSysWindowMgr = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mLytParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
mLytParams.format = PixelFormat.TRANSLUCENT;
mLytParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
onCreateView();
}