在带有 Android 4.0.4的三星galaxy Note 10.1上,当两个手指放在屏幕上时,GestureDetector不会触发OnGestureListener#onScroll(它只用于一根手指).这适用于其他设备.在我的应用程序中,我想只在涉及至少两个手指时启用滚动.

这是重现现象的视图实现:

public class MyView extends View {

    GestureDetector scrollGestureDetector;

    public MyView(Context context,AttributeSet attrs) {
        super(context,attrs);

        scrollGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onScroll(final MotionEvent e1,final MotionEvent e2,final float distanceX,final float distanceY) {
                System.out.println("SCROLL " + distanceX + "," + distanceY);
                return true;
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        scrollGestureDetector.onTouchEvent(event);
        return true;
    }
}

这种行为是已知/记录/想要的吗?有没有已知的解决方法?

解决方法

您需要在GestureDetector.SimpleOnGestureListener中再实现一个onDown方法,如下所示:
scrollGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onScroll(final MotionEvent e1,final float distanceY) {
            System.out.println("SCROLL " + distanceX + "," + distanceY);
            return true;
        }

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

    });

因为根据this document和this guide:

Notified when a tap occurs with the down MotionEvent that triggered
it. This will be triggered immediately for every down event. All other
events should be preceded by this.

Whether or not you use GestureDetector.OnGestureListener,it’s best
practice to implement an onDown() method that returns true. This is
because all gestures begin with an onDown() message. If you return
false from onDown(),as GestureDetector.SimpleOnGestureListener does
by default,the system assumes that you want to ignore the rest of the
gesture,and the other methods of GestureDetector.OnGestureListener
never get called. This has the potential to cause unexpected problems
in your app. The only time you should return false from onDown() is if
you truly want to ignore an entire gesture.

您需要在onDown中返回true,以便触发onScroll.

android – OnGestureListener#onScroll未在三星Galaxy Note 10.1上从GestureDetector调用的更多相关文章

  1. ios – UIScrollView自动滚动64点

    我正在将UIScrollView添加到UIViewControllers视图中.出于某种原因,在将滚动视图添加到视图并显示之间,contentOffset设置为{0,-64},64是状态栏的20加上导航栏的44点(我猜).下面是一些重现问题的代码和图像.如何阻止iOS设置contentOffset?

  2. swift详解之十八------------ScrollView

    ScrollView注:本小节详细介绍scrollView的用法UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容UIScrollView的用法,将需要展示的内容添加到UIScrollView中设置UIScrollView的contentView属性,告诉UIScrollView所有内容的尺寸这里我创建了一个scrollview并设置的一些属性,然后添加了四个小狗的图片。下面看看uiscrollviewdelegate中的一些其他的事件这里面都清楚的记

  3. 使用SnapKit约束label、scrollview和tableview

    解决的方法是,在其中加一个viewContainer,让scrollview的contentSize.height自适应viewContainer,而viewContainer的高度自适应与其中的各个控件。重点内容都在代码里:三、约束UITableViewCell基于上面的方法,这个就比较简单了,以前苦逼的计算每个cell的高度/(ㄒoㄒ)/~~在这里可以直接把Cell当做上面的viewContainer就好了。重点是UITableView的属性设置:内容大概就这么多吧,别急着赶路,把路填平了,才能跑起来

  4. android – iPhone X /三星Galaxy S8纵横比问题适用于cocos2dx游戏

    还是我在这里忽略了另一种解决方案?

  5. android – IncompatibleClassChangeError com.google.gson.annotations.SerializedName.value

    当用户从Play商店更新应用程序时,我们在Samsung设备中收到IncompatibleClassChangeError.请检查下面的日志.代码如下:LoginResponse是我的POJO课程.将返回JSON字符串,这是服务器响应.解决方法看起来像三星问题..很多人不仅与gsonlib有同样的问题,而且还有其他库.我认为你不能做太多,只等三星开发人员解决这个问题.已经这个问题是在三星开发者论坛

  6. android – 三星设备上的AcousticEchoCanceler无法正常工作

    解决方法试试这些:

  7. android – 三星Galaxy S2 2.3.5没有调用overScrollBy()

    似乎三星禁止他们的过度滚动.我有一个扩展ScrollView和覆盖的视图的实现在每个其他设备上,当滚动器到达它结束时调用overScrollBy,并且用户实际上可以过度滚动视图).在Android2.3.5上,三星实施了一种完全禁用过度滚动的机制,每次用户尝试过度滚动时,都会打印以下LogCat事件:有没有办法解锁三星在那里做的事情?解决方法我刚遇到同样的问题,最后提出了以下自定义过卷检测:

  8. android – Galaxy s3上的媒体播放器1004错误

    我有一个视频视图,显示来自网络的内容.当我使用Android4.2玩nexus7时它工作正常,但是当我在GS3上播放时,会返回错误1004IO错误.有谁知道为什么会这样?

  9. android – 我怎么能在三星和所有其他设备上获得正确的外部存储?

    或者只是教我如何避免这个问题?谢谢.解决方法你不能尝试这样的事情:

  10. Android – 显示/隐藏片段留下空白区域

    鉴于:>屏幕上有两个垂直放置的元素(ViewPager和Fragment)>第一个当前选定片段(ViewFlipper)中的操作在顶部片段中基于文本和基于WebView的视图之间切换,并隐藏/显示底部片段.观测到的:>隐藏底部片段会留下底部片段所在的空白区域.我尝试了Relative和LinearLayout(顶部片段设置为weight=1)但是底部片段被移除后都没有效果我底部仍然有空的空间这是顶

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部