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

手势检测器检测GridView项上的双击

冷宏茂
2023-03-14

注:此具体问题已解决,但存在严重的后续问题。查看GestureDetector-在GridView项目中双击Detect,但在onTouchEvent()中返回false

我想检测图像的< code>GridView中不同项目的双击。因此,我为适配器的< code>getView()方法中的每个项目< code>imageView分配了一个单独的< code>OnTouchListener。< code>gestureDetector是adapter-class的成员变量。

private GestureDetectorCompat gestureDetector;

public ImageGridViewAdapter(Context c, ArrayList<UriWrapper> startUpImages)     {
    mContext = c;
    uriManager  = new UriManager(startUpImages);
    gestureDetector = new GestureDetectorCompat(mContext, new SingleTapConfirm());
}

public View getView(final int position, View recycled, ViewGroup parent) {

    ViewHolder holder;
    if (recycled == null) {
       ..... find items by id
    } else{
        holder = (ViewHolder) recycled.getTag();
    }

    // Set listener to item image
    holder.image.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // Always returns false, the gestureDetector does not detect anything
            boolean ret = gestureDetector.onTouchEvent(event);
            // At least the onTouch-callback gets called with the correct position
            Log.e(TAG, "onTouch returned " + ret + " at position " + position);
            return true;
        }
    });

    // Use glide library to load images into the image views
    Glide.with(mContext)....into(holder.image);
    return recycled;
}

私有类SingleTapConfirm扩展了GestureDetector。SimpleOnGestureListener(简单手势侦听器){

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        Log.e(TAG, "onSingleTapConfirmed"); // never called..
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.e(TAG, "onDoubleTap"); // never called..
        return super.onDoubleTap(e);
    }
}

< code>OnTouchListener的工作,并在正确的位置被调用。然而,无论我做什么,都不会调用< code>GestureDetector的方法。这段代码似乎有什么问题?

更新:onTouch回调需要返回true,现在至少GestureDetector可以工作了。但是,返回true会破坏其余功能,因为我的GridView有一个长单击选择模式和一个全局OnTouchListener。

第二次更新:合并特定于项目的OnTouchListener和全局OnTouchListener不能正常工作。(只在某些项目上识别滑动手势)我希望我可以通过创建一个扩展ImageView的自定义视图并将特定于项目的视图分配给TouchListener来解决这两个问题。

共有1个答案

宇文弘懿
2023-03-14
 private GestureDetectorCompat gestureDetector;

    // in your adapter constructor
    gestureDetector = new GestureDetector(context, new SingleTapConfirm());

    public View getView(final int position, View recycled, ViewGroup parent) {

        ViewHolder holder;
        if (recycled == null) {
            .....find items by id
        } else {
            holder = (ViewHolder) recycled.getTag();
        }

        // Set listener to item image
        holder.image.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // Use lazy initialization for the gestureDetector
                gestureDetector.onTouchEvent(event);
                // At least the onTouch-callback gets called with the correct position
                return true;
            }
        });

        // Use glide library to load images into the image views
        Glide.with(mContext)....into(holder.image);
        return recycled;
    }

    private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent event) {
            Log.e(TAG, "onSingleTapConfirmed"); // never called..
            return true;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.e(TAG, "onDoubleTap"); // never called..
            return super.onDoubleTap(e);
        }
    }

更新:

        @Override
        public boolean onTouch(View v, MotionEvent event) {anything
            gestureDetector.onTouchEvent(event);
            return true;
        }
 类似资料:
  • 问题内容: 想象一下带有4个按钮的布局 我想在整个布局上检测击退手势,但是当击退开始时未检测到按钮。 我正在使用: 如果没有可点击的项目,则失败,但如果猛击开始于可点击的项目,则失败。 我该如何解决?悬赏50分可获得完整的工作答案 问题答案: 我实现这一目标的一种方法是重写以下方法: 您可以在布局容器中覆盖此方法(例如,ViewGroup或按住按钮的任何对象),然后继续从该方法返回以“拦截”子项(

  • 似乎有很多关于它的问题,但许多问题是他们无法获得他们想要的触摸事件,并通过覆盖onDown()并返回true来解决,它说来自开发人员文档 最佳实践是实现一个返回true的onDown()方法。这是因为所有手势都以onDown()消息开头。如果从onDown()返回false,则为GestureDetector。默认情况下,SimpleOnGestureListener会这样做,系统假设您想忽略手势

  • 问题内容: 我需要检测到的一行上双击。 如何侦听该行任何部分的双击并获取该行的所有数据以将其打印到控制台? 问题答案: 这是一个完整的工作示例:

  • 我需要检测对行的双击。 如何监听该行任何部分的双击并获取该行的所有数据以将其打印到控制台?

  • 本文向大家介绍Android GestureDetector用户手势检测实例讲解,包括了Android GestureDetector用户手势检测实例讲解的使用技巧和注意事项,需要的朋友参考一下 一、概述 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。 一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onT

  • 问题内容: 我想连接一个动作,以便如果该手势是轻击,它确实会以特定方式为对象设置动画,但是如果按下时间超过0.5秒,它将执行其他操作。 现在,我只是将动画连接起来。我不知道如何区分长按和水龙头?我如何获得新闻发布时间以实现上述目标? 问题答案: 定义两个并为每个设置一个。这样,您可以为每个手势执行两种不同的操作。 您可以在界面构建器中将每个设置为不同的IBAction。 通过没有界面构建器的代码