创建WindowManager窗口

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();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值