Xamarin.Forms。 SwipeGesture 和 ScrollView 在 Android 上不能一起使用

2023-12-04

我将 Grid 与 SwipeGesture 和 ScrollView 一起使用。 ScrollView 运行良好,但 SwipeGesture 不适用于 Android。在 iOS 中我没有问题。

为什么?请帮帮我

<Grid x:Name="grid">
     <Grid.RowDefinitions>
          <RowDefinition Height="*"/>
           <RowDefinition Height="auto"/>
      </Grid.RowDefinitions>

      <ScrollView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        ...
     </ScrollView>
 </Grid>

C#:

 var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
 leftSwipeGesture.Threshold = 50;
 leftSwipeGesture.Swiped += (sender, e) => Navigation.PopAsync();
 grid.GestureRecognizers.Add(leftSwipeGesture);

我解决了这个问题基于link。我创建了一个新组件:

public class GestureScrollView : ScrollView
{
    public event EventHandler SwipeLeft;
    public event EventHandler SwipeRight;

    public void OnSwipeLeft() =>
        SwipeLeft?.Invoke(this, null);

    public void OnSwipeRight() =>
        SwipeRight?.Invoke(this, null);
}

安卓渲染器:

[assembly: ExportRenderer(typeof(GestureScrollView), typeof(GestureScrollViewRenderer))]
namespace SwipeScrollView.Droid.Platform.Renderers
{
public class GestureScrollViewRenderer : ScrollViewRenderer
{
    readonly CustomGestureListener _listener;
    readonly GestureDetector _detector;

    public GestureScrollViewRenderer(Context context) : base(context)
    {
        _listener = new CustomGestureListener();
        _detector = new GestureDetector(context, _listener);
    }

    public override bool DispatchTouchEvent(MotionEvent e)
    {
        if (_detector != null)
        {
            _detector.OnTouchEvent(e);
            base.DispatchTouchEvent(e);
            return true;
        }

        return base.DispatchTouchEvent(e);
    }

    public override bool OnTouchEvent(MotionEvent ev)
    {
        base.OnTouchEvent(ev);

        if (_detector != null)
            return _detector.OnTouchEvent(ev);

        return false;
    }

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement == null)
        {
            _listener.OnSwipeLeft -= HandleOnSwipeLeft;
            _listener.OnSwipeRight -= HandleOnSwipeRight;
        }

        if (e.OldElement == null)
        {
            _listener.OnSwipeLeft += HandleOnSwipeLeft;
            _listener.OnSwipeRight += HandleOnSwipeRight;
        }
    }

    void HandleOnSwipeLeft(object sender, EventArgs e) =>
        ((GestureScrollView)Element).OnSwipeLeft();

    void HandleOnSwipeRight(object sender, EventArgs e) =>
        ((GestureScrollView)Element).OnSwipeRight();
}
}

自定义手势监听器:

public class CustomGestureListener : GestureDetector.SimpleOnGestureListener
{
    static readonly int SWIPE_THRESHOLD = 100;
    static readonly int SWIPE_VELOCITY_THRESHOLD = 100;

    MotionEvent mLastOnDownEvent;

    public event EventHandler OnSwipeLeft;
    public event EventHandler OnSwipeRight;

    public override bool OnDown(MotionEvent e)
    {
        mLastOnDownEvent = e;

        return true;
    }

    public override bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
    {
        if (e1 == null)
            e1 = mLastOnDownEvent;

        float diffY = e2.GetY() - e1.GetY();
        float diffX = e2.GetX() - e1.GetX();

        if (Math.Abs(diffX) > Math.Abs(diffY))
        {
            if (Math.Abs(diffX) > SWIPE_THRESHOLD && Math.Abs(velocityX) > SWIPE_VELOCITY_THRESHOLD)
            {
                if (diffX > 0)
                    OnSwipeRight?.Invoke(this, null);
                else
                    OnSwipeLeft?.Invoke(this, null);
            }
        }

        return base.OnFling(e1, e2, velocityX, velocityY);
    }
}

Core:

<ctrl:GestureScrollView x:Name="gi"> ... </ctrl:GestureScrollView>

gi.SwipeLeft += (s, e) =>
    DisplayAlert("Gesture Info", "Swipe Left Detected", "OK");                     

gi.SwipeRight += (s, e) =>
    DisplayAlert("Gesture Info", "Swipe Right Detected", "OK");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin.Forms。 SwipeGesture 和 ScrollView 在 Android 上不能一起使用 的相关文章

  • 数据库“/data/data/msv_database.db”的连接池无法授予连接。连接数:0 个活动连接、1 个空闲连接、0 个可用连接

    我收到以下错误 在整个应用程序中使用单个数据库对象从两个不同线程访问数据库时 数据库连接池 data data msv database db 无法授予与线程 802 的连接 连接数 0 个活动连接 1 个空闲连接 0 个可用连接 也许您想
  • Android - 如何使密封类扩展其他密封类?

    我的 UIState 有一个密封的界面 sealed interface UIState
  • 如何使全屏覆盖在方向更改后保持全屏?

    我正在制作一个应用程序 它可以创建在屏幕上行走的微小精灵动画 我有一个主要活动 带有 启动服务 按钮 这会启动一个服务 该服务 在onCreate 创建一个全屏视图并将其附加到根窗口管理器 这部分工作完美 它充满了屏幕 您可以离开应用程序
  • 处理 SavedInstances 并恢复活动

    基本上我的应用程序有 2 个活动 说 A 和 B A 启动 B Activity B 播放音乐并且还有通知 情况 1 当视图仍在活动 B 上时 我按主页按钮 然后单击通知 活动 B 将打开 其视图完好无损并播放音乐 因为在清单中我使用 an
  • 单击另一个项目/小部件时展开/打开微调器?

    当用户单击另一个按钮时 我试图展开微调器 例如 我有一个带有值的微调器和一个 确定 按钮 当用户单击 确定 按钮而不从微调器中选择任何值时 微调器会自行扩展 是否可以在无需用户与微调器交互的情况下获得扩展微调器的事件 只需致电Spinner
  • 禁用 com.google.android.maps.MapView 中的平移/缩放

    如何禁用 MapView 的平移 缩放功能 不是缩放控件 我想要一个完全静态的地图 我还注意到触摸地图似乎不会触发 MapView onClickListener 有人可以详细说明为什么吗 对于 Android 版 Google Maps
  • Android 软键盘 - 禁用某些键

    我正在寻找一种使用内置软键盘并禁用某些键的方法 例如 如果用户不应该使用字母 f 因为在列表中该字母不存在 则该键应显示为灰色 想象一下 用户可以在文本框中键入文本以从列表中进行选择 该列表包含 ABC BCCD 床 如果用户输入 A 然后
  • Android:将图像裁剪为特定尺寸

    我的目的是让用户从图库中选择一张图像 然后进行裁剪活动 但是 我需要将定义裁剪蒙版的矩形锁定到某个尺寸 然后用户只需重新定位它即可显示图像的一部分 关于如何做到这一点有什么想法吗 Thanks T Intent intent new Int
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • 如果未安装应用程序,深层链接将重定向到 Play 商店

    我在我的应用程序中使用深度链接的概念 我真正想要的是 当我共享我的应用程序中的链接时 它工作正常 它会转到我想在我的应用程序中打开的活动 但问题是当用户没有这个时应用程序此链接通过手机浏览器打开 显示错误 未找到 但如果未安装应用程序 我想
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • Android 上的 SQLite JDBC 驱动程序

    我正在尝试使用xerial sqlite jdbc在 Android 中管理我的数据库没有成功 我得到了java lang NoClassDefFoundError org sqlite SQLiteConnection异常 我已经导入了这
  • java.lang.AssertionError:CALL 'public final fun

    我正在尝试使用 jetPack Compose 制作一个项目 我拥有它工作所需的所有必要依赖项 但是当我运行我的应用程序时 它会抛出一个错误 我找不到解决方案 这是错误 java lang AssertionError CALL publi
  • Eclipse 在 Android SDK 内容加载器处挂起

    我已经在 OS X 10 8 2 上使用 Eclipse 4 2 Juno 版本 20120920 0800 几个星期了 为 Android 3 0 及更高版本构建应用程序 我有一台带 SSD 的四核 i7 MacBook Pro 因此性能
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 解析 XML 标签不匹配时出错

  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用

随机推荐

  • Windows 和 Linux 之间的 C++ 可移植性

    我有一个关于编写可在 Windows 和 Linux 之间移植的程序的问题 最近我意识到 如果你编写一个使用任何类型的外部库的程序 如果该库没有 Linux 版本 或者在 Linux 中开发时没有 Windows 版本 那么你就完蛋了 那么
  • 如何使用 .htaccess url 重写添加 .php 扩展名?

    我已经在我的网站上设置了 htaccess 文件 该文件将 SLUG 文本显示为 URL 中的页面名称 但不带扩展名 例如真实网址是 www mywebsite com page php page about us 然后通过url重写加载到
  • 尝试使用 pygame.display.update 在 pygame 中显示 png 文件,它显示不到一秒然后消失。

    图像是一张扑克牌 我们使用的是 pygame 4 5 社区版和 pycharm 2 6 9 因为 2 7 不支持 pygame 这是学校 这是代码 import pygame pygame init picture pygame image
  • Pandas:如何通过以下方式连接数据帧?

    我想将多个数据帧连接成一个数据帧 我希望发生串联的方式如以下示例所示 Input tables A B C D 0 x p 2 4 1 y q 3 5 A B E F 0 x p 6 8 1 y q 9 10 Output table A
  • 如何将文本对象添加到现有的pdf中

    我有一个源 pdf 我正在通过添加文本对象来修改它 我正在使用 PDF 规范中提到的 增量更新 但是 在使用此方法添加文本对象时 我犯了一些错误 导致 pdf 在 Adob e Reader 11 中无法正确呈现 当打开 pdf 并双击它时
  • 将扫描仪类与 GUI 一起使用

    我使用 java swing 创建 GUI 并使用扫描仪类获取从 JTextFields 输入到服务器的信息 这可能吗 如果可能的话怎么办 不 没有控制台 因此不要使用 Scanner 相反 您可以使用 TextField 的 getTex
  • 如何使用 BeginInvoke 从 BackgroundWorker 更新 RichTextBox

    我有一个小应用程序 它读取管道分隔文件并将行写入 RTB 突出显示某些 列 中是否存在不允许的字符 这工作得很好 但是 用户想要一个进度条 并看到 实时 写入的行 并且能够中途取消 我有以下扩展方法 我一直用它来写入 RichTextBox
  • Neo4jClient Cypher 查询的排序顺序不正确

    我有以下 Neo4jClient 代码 var queryItem graphClient Cypher Start new n Node ByIndexLookup myindex Name sku Match p n r Relatio
  • 当 SSRS 中的数据不存在时填充“0”

    我正在尝试在 SSRS 中创建一个报告 其中有一个矩阵 其中性别作为列标题 专门定义的年龄组作为行 该报告按日期排序 即 显示的记录按 modifedAt 值过滤 我的问题是 我希望显示所有年龄组类别 即使数据集不返回该行的任何数据 因此
  • 有没有一个网站可以让我查看不同浏览器支持哪些 HTML 5 标签?还有WebGL?

    我想制作一个 HTML Javascript 网络应用程序 有没有一个网站可以比较哪些浏览器已经支持 HTML5 标签 还有WebGL 是的 有很多 以下是每个人的几个 HTML http a deveria com caniuse HTM
  • 如何查询到Firestore子文档

    我正在开发一个应用程序 我想查询 Firestore 子文档 让我进一步解释一下 我有一组存储汽车的文档 每个文档都有一辆带有描述的特定汽车 在上面的每个文档中 我都有一个名为的子集合user data它有自己的文档 其中存储了将汽车添加到
  • C#.NET 线程问题

    我面临 C NET 应用程序中线程之间通信的问题 希望有人能指导我找到可能的解决方案的正确方向 我有一个 C NET 中的应用程序 它是一个 Windows 窗体应用程序 我的应用程序有两个线程 一个线程是主线程 UI 线程 另一个线程是子
  • J表。删除行。消耗事件以不再进一步分派

    我需要按删除键从 JTable 中删除行 所以用例非常简单 用户选择一些行 按删除键 行就会被删除 代码也很简单 DefaultTableModel tableModel DefaultTableModel table getModel i
  • 库“dart:isolate”中是否有 dart 的 `spawnUri(...)` 示例?

    有一个spawnUri uri 函数于dart isolate 但我没有找到任何例子 我猜到了它的用法 但失败了 假设有2个文件 在第一个文件中 它会调用spawnUri对于第二个 并与之沟通 首先 dart import dart iso
  • 验证 JTextField 值,使其以“RA”开头,然后有 8 位数字

    我有一个JTextField用户必须在其中输入数据 它的价值必须始终从RA并且后面必须正好有 8 位数字 因此 它的长度始终为 10 例如 RA12345678 我如何在 Java 中执行此操作 我尝试使用MaskFormatter and
  • 如何检测哪个 EKevent 被更改

    我遇到问题了 我需要知道 EventStore 中的事件何时发生更改 因此对于本例我使用EKEventStoreChangedNotification但这个通知给我带来了难以理解的字典userInfo它看起来像这样 EKEventStore
  • python加密模块中的错误:_RSAPrivateKey'对象没有属性'sign

    在我的 Python 代码中 我使用密码学模块 我的磁盘上有一个私钥 所以 根据文档 我使用了这个例子加载该密钥 然后使用该密钥对消息进行签名 但运行程序会抛出 AttributeError RSAPrivateKey 对象没有属性 sig
  • 学习正则表达式 (PHP) 的最佳地点是哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 学习正则表达式 PHP 的
  • 备份/恢复整个 Eclipse 工作区

    我开始学习Android操作系统 我还处于学习模式 在学习 Android 的同时 我似乎对 Java 有了一些了解 因为我发现的大多数示例都希望您使用 Eclipse 好吧 我想我也在学习 Eclipse 这是一件好事 我不是在抱怨 这个
  • Xamarin.Forms。 SwipeGesture 和 ScrollView 在 Android 上不能一起使用

    我将 Grid 与 SwipeGesture 和 ScrollView 一起使用 ScrollView 运行良好 但 SwipeGesture 不适用于 Android 在 iOS 中我没有问题 为什么 请帮帮我