Android:如何防止任何触摸事件从视图传递到它下面的视图?

9wbgstp7  于 2023-03-27  发布在  Android
关注(0)|答案(8)|浏览(224)

特别是使用下面的代码,有没有办法修改它,使这个新创建的视图下的Activity不接收任何手势?

View v1 = new View(this);    
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
 1000,
 50,
 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
 PixelFormat.OPAQUE);

params.gravity = Gravity.BOTTOM;
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
wm.addView(v1, params);
sz81bmfz

sz81bmfz1#

添加一个onTouchEvent方法到视图的top位置,然后返回true。True将告诉事件冒泡事件已被消费,因此防止事件冒泡到其他视图。

protected boolean onTouchEvent (MotionEvent me) {
    return true;
}

对于v1,您可以执行导入:

import android.view.View.OnTouchListener;

然后设置onTouchListener:

v1.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});
n9vozmp4

n9vozmp42#

来自代码

View v1 = new View(this);   
v1.setClickable(true);
v1.setFocusable(true);

来自xml

<View
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="My button"
    android:focusable="true"
    android:clickable="true"/>

这将防止触摸和单击事件传播到位于视图下方的视图。
或者,如果您扩展视图,则在.xml中添加android:clickable="true"

o2g1uqev

o2g1uqev3#

你也可以这样做,你可以把touch listener设置为子视图,然后在onTouch()事件中,你可以阻止父视图的intercept touch event-使用我从https://stackoverflow.com/revisions/19311197/1的答案中复制的代码-

View v = findViewById(R.id.sample_view); v.setOnTouchListener(new
OnTouchListener() {
    // Setting on Touch Listener for handling the touch inside ScrollView
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // Disallow the touch request for parent scroll on touch of child view
    v.getParent().requestDisallowInterceptTouchEvent(true);
    return false;
    } });
m528fe3b

m528fe3b4#

你可以像下面这样添加一个视图,但要确保它是你添加到xml中的最后一个视图。xml中的最后一个项目是位于它下面所有其他视图之上的项目。

<View
        android:id="@+id/blocking_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#AA666666"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"/>
hsvhsicv

hsvhsicv5#

你只需要打个电话

arg0.getParent().requestDisallowInterceptTouchEvent(true);

在你的onTouch功能的开始。像这样-

@Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        arg0.getParent().requestDisallowInterceptTouchEvent(true);
        switch(arg1.getActio){
        }

        return false; 

     }
oalqel3c

oalqel3c6#

我认为最好的方法是添加一个触摸事件,并设置返回值True
如您所见:

someView.setOnTouchListener(object: View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent?): Boolean{
            return true
        }

    })

返回True意味着顶视图正在处理触摸并且不需要将触摸事件移交给其它相关视图。

e0uiprwp

e0uiprwp7#

我有点晚了,但我不认为公认的解决方案是非常好的。这里是一个静态方法,接受任何数量的视图,并禁用此事件冒泡。这对我来说是100%的时间为API 17+(较低的未经测试)

public static void disableEventBubbling(View... views){
    for(View view : views){
        if(view != null){
            view.setOnTouchListener(new View.OnTouchListener(){
               @Override
                public boolean onTouch(View view, MotionEvent event){
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    return false;
                }
            });
        }
    }
}

您可以为您想要的任何类型的事件添加一个case,或者您可以摆脱开关并使默认case成为触摸侦听器中的唯一一行。

mec1mxoz

mec1mxoz8#

只需添加一个点击委托顶视图背景,这将停止下面的视图接收触摸

linear_layout_background.Click += delegate
            {
                // Ensures views underneath does not receive touch events
            };

相关问题