如何检测任何视图的长按位置?

Posted

技术标签:

【中文标题】如何检测任何视图的长按位置?【英文标题】:How to detect the long pressed position of an Any View? 【发布时间】:2016-05-12 07:25:46 【问题描述】:

我正在创建一个自定义 UI 组件,用户可以在其中上传地图图像,然后用户可以指定某些位置并显示图钉。首先,加载地图的图像后,用户将能够平移和缩放到任何位置。为此,我使用了以下示例,它就像一个魅力。 TouchImageView

下一部分是在图像上长按时添加一个图钉。为此,我在地图图像上使用了绝对布局,并在最后添加了一个 OnTouchListener 和 Returned false,以便 ImageView 上的触摸侦听器也能正常工作。我实现了 OnTouchListener 如下

absoluteLayout.setOnTouchListener(new View.OnTouchListener() 
        @Override
        public boolean onTouch(View v, final MotionEvent event) 
            switch (event.getAction())
                case MotionEvent.ACTION_DOWN:
                    count=-1;// reset count. Thredd will start as 0
                    released = false;// Touch long press is started
                    final Handler handler = new Handler();
                    new Thread(new Runnable() 
                        @Override
                        public void run() 
                            while(!released)//Stop count if touch released
                                try 
                                    count++;// Count every 200 ms
                                    Thread.sleep(200);
                                    if(count>10) //if pressed for 200*10= 2 seconds 
                                        released=true;

                                        handler.post(new Runnable() 
                                            @Override
                                            public void run() 
                                                addPin((int) event.getX(), (int) event.getY());//Calling the method to add the pin
                                            
                                        );
                                    
                                 catch (InterruptedException e) 
                                    e.printStackTrace();
                                
                            

                        
                    ).start();
                    break;

                case MotionEvent.ACTION_UP:
                    released=true;// touch is released
                    break;
                case MotionEvent.ACTION_MOVE:
                    released=true; // touch is a movement therefore release long press 
                    break;
            

            return false;
        
    );

但这里的问题是使用 case :"MotionEvent.ACTION_MOVE" 它总是使长按释放。但是如果没有它,如果用户尝试平移或缩放 imageView,它将添加一个图钉。

当用户缩放或平移地图时,如何检测触摸是否有移动并忽略?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以指定最小移动量来确定它是否是意外移动,就像 here 中解释的那样

【讨论】:

以上是关于如何检测任何视图的长按位置?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何检测按钮上的长按?

在 UIScrollView 中检测长按

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

在 xamarin.forms 中使用 c# 的长按检测器