DispatchTouchEvent

DispatchTouchEvent

【问题驱动学习】

解决方案一

使用了WindowManager 在原始的activity_main布局中加载了一个mylayout布局

问题点:原有的布局中的按钮无法点击,一直被WindowManager的addView进来的布局所覆盖着,这里就需要加入事件分发处理

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.test1).setOnClickListener(this);
        findViewById(R.id.tt).setOnClickListener(this);
        mView = LayoutInflater.from(this).inflate(R.layout.mylayout, null);
        mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
        // 可以对params进行一些设置
        params.gravity = Gravity.CENTER;
        //表示系统会将当前Window区域以外的单击事件传递给底层的Window,而区域以内的单击事件则自己处理。一般都需要开启此标记,否则其他Window将无法收到单击事件。
        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
        params.width = 120;
        params.height = 72;
        mWindowManager.addView(mView, params);
    }


解决方案二

除了分发处理的方案,还有一个便捷的解决处理方法LayoutParams.FLAG_NOT_TOUCH_MODAL 可以让区域外的点击事件直接传递给底层的window

public class MainActivity extends AppCompatActivity implements OnClickListener {
    private WindowManager mWindowManager;
    private View mView;
    private Button tt;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mView = LayoutInflater.from(this).inflate(R.layout.mylayout, null);
        mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
        // 可以对params进行一些设置
        params.gravity = Gravity.CENTER;
        //表示系统会将当前Window区域以外的单击事件传递给底层的Window,而区域以内的单击事件则自己处理。一般都需要开启此标记,否则其他Window将无法收到单击事件。
        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
        params.width = 1200;
        params.height = 720;
        mWindowManager.addView(mView, params);
        init();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tt:
                Toast.makeText(this, "ppppp", Toast.LENGTH_SHORT).show();
                mWindowManager.removeViewImmediate(mView);
                break;
        }
    }


    private void init() {
        tt = findViewById(R.id.tt);
        tt.setOnClickListener(this);
    }


}

posted @ 2022-12-08 14:04  阿寳同學Zybao  阅读(32)  评论(0)    收藏  举报