当前位置: 首页 > 知识库问答 >
问题:

是否可以从子 xml 元素截获触摸事件

狄令
2023-03-14

我有一个视图寻呼机,我想拦截其父容器上的触摸事件。xml如下所示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
 android:id="@+id/layoutContainer"
android:layout_height="match_parent" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="0dp" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>
</RelativeLayout>
</RelativeLayout>

由于视图寻呼机占据了整个屏幕,如果尝试将onTouchListener附加到id为“layoutContainer”的容器上,则不会触发任何操作。

我希望能够检测屏幕上的垂直滑动手势

private class MyGesture extends GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {

        return super.onSingleTapConfirmed(e);
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {

        Snap snap = snaps.get(targetPosition);

        return super.onSingleTapUp(e);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        float deltaX = e2.getX() - e1.getX();
        float deltaY = e2.getY() - e1.getY();

        if ((Math.abs(deltaX) < SWIPE_MIN_DISTANCE) || (Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY)) {

        }
        else {

        }

        if ((Math.abs(deltaY) < SWIPE_MIN_DISTANCE) || (Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY)) {

        }
        else {
            app.log("swipe up");
            //execute some code here
        }
        return true;
    }

}

我尝试做的另一件事是将触摸监听器连接到视图寻呼机,然后手动将运动事件传递给手势检测器,但这也不起作用。

共有1个答案

谷梁迪
2023-03-14

您可以创建containerview extends RelativeLayout,并覆盖此视图组中的onInterceptTouchEvent。这样地:

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mDownX = event.getX();
            mDownY = event.getY();
            return false;
        case MotionEvent.ACTION_MOVE:
            if (Math.abs(event.getX() - mDownX) < Math.abs(event.getY() - mDownY)) { // Up and down around sliding distance is greater than sliding distance;
                return true;
            }
            return false;
        default:
            break;
    }
    return false;
}
 类似资料:
  • 触摸操作概述 浏览器的触摸 API 由三个部分组成。 Touch:一个触摸点 TouchList:多个触摸点的集合 TouchEvent:触摸引发的事件实例 Touch接口的实例对象用来表示触摸点(一根手指或者一根触摸笔),包括位置、大小、形状、压力、目标元素等属性。有时,触摸动作由多个触摸点(多根手指)组成,多个触摸点的集合由TouchList接口的实例对象表示。TouchEvent接口的实例对

  • 触摸事件是手机游戏中最重要的事件,它易于创建,还能提供多种多样的功能。 让我们先了解一下什么是触摸事件,当你触摸移动设备的屏幕时,设备感受到被触摸,了解到被触摸的位置,同时取得触摸到的内容,然后你的触摸被回答。 这就是触摸事件。 如果你希望通过触摸控制屏幕下层的对象,那可以通过 优先级,达成这种需求,优先级高的对象能先处理事件。 创建触摸事件监听器: // Create a "one by on

  • 我有一个简单的布局: 在我的自定义框架布局中,我正在重写: 并且返回false。滚动列表视图时,onInterceptTouchEvent接收ACTION_ DOWN和第一个ACTION_。然后,ListView似乎会接管,onInterceptTouchEvent无法接收以下ACTION_MOVE事件。 这与文档所述的内容相悖: 因为只要从这个函数返回false,每个后续事件(直到并包括最终的u

  • 我有问题,因为我想在内部包围一些,所以我需要知道。 哪些DOM元素可以是tr的子元素?(我知道div不能。)

  • 问题内容: 在Interface TakesScreenshot 页面上,我发现了这一点: 捕获屏幕截图并将其存储在指定位置。对于扩展了TakesScreenshot的WebDriver,这将根据浏览器尽最大努力按优先顺序返回以下内容:-整个页面- 当前窗口-当前帧的可见部分-包含浏览器的整个显示器的屏幕截图 对于扩展TakesScreenshot的WebElement,这将尽最大努力,具体取决于

  • 问题内容: 我想采用一个现有的枚举,并向其添加更多元素,如下所示: 这在Java中可行吗? 问题答案: 不,你无法使用Java执行此操作。除了别的什么,d大概就是A(扩展的“正常”想法)的一个实例,但是只知道这一点的用户却一无所知-这违背了枚举作为一组众所周知的集合的观点。价值观。 如果你可以告诉我们更多有关如何使用它的信息,我们可能会建议其他解决方案。