Flutter项目手势运用及单独指针消歧问题解决方案

目录
  • 对于手势的运用
  • 单独指针
  • 消歧
  • 依赖包中的字体

对于手势的运用

指针表示用户与设备屏幕交互的原始数据。有四种类型的指针事件 PointerDownEvent指针触摸屏幕上的特定位置 PointerMoveEvent指针从屏幕上的一个位置移动到另一个位置 PointerUpEvent指针停止触摸屏幕 PointerCancelEvent指针的输入事件不再针对此应用程序(事件取消)

 Widget build(BuildContext context) {
    return new GestureDetector(
      onTap: _handleTap,
      child: new Container(
        child: new Center(
          child: new Text(
            _active ? 'Active' : 'Inactive',
            style: new TextStyle(fontSize: 32.0, color: Colors.white),
          ),
        ),
        width: 200.0,
        height: 200.0,
        decoration: new BoxDecoration(
          color: _active ? Colors.lightGreen[700] : Colors.grey[600],
        ),
      ),
    );
  }
}

当按下指针时,框架将在应用程序上执行_点击测试_,以确定指针与屏幕相交的位置存在哪些小部件。然后,指针按下事件(以及该指针的后续事件)被分发到_命中测试_找到的最里面的小部件。从那里,这些事件将在小部件树中弹出。这些事件将从最里面的小部件分发到小部件根路径上的所有小部件。没有取消或停止冒泡过程的机制。 要直接从窗口小部件层侦听指针事件,请使用侦听器窗口小部件。然而,一般来说,考虑使用手势(如下所述)。要直接从小部件层侦听指针事件,可以使用Listenerwidgets。

单独指针

手势表示可以从多个单独指针事件(甚至多个单独的指针)中识别的语义动作(如敲击、拖动和缩放)。一个完整的手势可以调度多个事件,对应于手势的生命周期(例如,拖动开始、拖动更新和拖动结束):

class ParentWidget extends StatefulWidget {
  @override
  _ParentWidgetState createState() => new _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
  bool _active = false;
  void _handleTapboxChanged(bool newValue) {
    setState(() {
      _active = newValue;
    });
  }
  @override
  Widget build(BuildContext context) {
    return new Container(
      child: new TapboxC(
        active: _active,
        onChanged: _handleTapboxChanged,
      ),
    );
  }
}

TaponTapDown指针已在特定位置与屏幕接触onTapUp指针停止在特定位置接触屏幕onTap tap事件触发onTapCancel之前由指针触发的onTapDown不会触发tap事件 双击DoubleTap可在同一位置连续两次快速点击屏幕 长按onLongPress指针可在同一位置长时间与屏幕保持接触 垂直拖动onVerticalDragStart指针已接触屏幕,并可能开始垂直移动。onVerticalDragUpdate指针已与屏幕接触并垂直移动OnVerticalDragEnd先前与屏幕接触且垂直移动的指针不再与屏幕接触,并在停止触摸屏幕时以特定速度移动 水平拖动onHorizontalDragStart指针已触摸屏幕,并可能开始水平移动onHorizontalDragUpdate指针接触屏幕并已水平移动onHorizontalDragEnd指针(以前接触屏幕并水平移动)不再接触屏幕,并在停止触摸屏幕时以特定速度移动 要从控件层监视手势,请使用手势检测器

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Center(
        child: new Text('Hello World', style: new TextStyle(fontSize: 32.0)),
      ),
    );
  }
}

如果使用“材质组件”,大多数小部件都会响应轻敲或手势。例如,IconButton和FlatButton响应按下(轻击),ListView响应滑动事件以触发滚动。如果不使用这些小部件,但希望在单击时具有“泼墨”效果,则可以使用InkWell。

消歧

在屏幕上的指定位置可能有多个手势检测器。当指针事件流通过并试图识别特定手势时,所有这些手势检测器都会监听指针事件流。手势检测器小部件确定它是哪个手势。 当屏幕上有多个给定指针的手势识别器时,框架通过向每个识别器添加“手势竞争场”来确定所需的手势。“手势比赛场”使用以下规则来确定哪个手势获胜 在任何时候,识别器都可以宣布失败并离开“手势比赛场”。如果“比赛场地”中只剩下一个标识符,则该标识符为获胜者

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //...
    Widget buttonSection = new Container(
      child: new Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          buildButtonColumn(Icons.call, 'CALL'),
          buildButtonColumn(Icons.near_me, 'ROUTE'),
          buildButtonColumn(Icons.share, 'SHARE'),
        ],
      ),
    );
  //...
}

在任何时候,识别器都可以宣布胜利,这将导致胜利,而所有剩余的识别器都将失败 例如,当消除水平和垂直拖动的歧义时,两个识别器在接收到指针向下事件时进入“手势竞争场”。识别器观察指针移动事件。如果用户将指针水平移动超过一定数量的逻辑像素,则水平识别器将宣布胜利,手势将被解释为水平拖动。类似地,如果用户垂直移动超过一定数量的逻辑像素,则垂直识别器将宣布获胜。 当仅水平(或垂直)拖动识别器时,“手势竞争场”是有益的。在这种情况下,“手势竞争领域”中只有一个识别器,水平拖动将立即被识别,这意味着第一个水平移动的像素可以被视为拖动,用户不需要等待进一步的手势消歧。

依赖包中的字体

如果包中定义的字体在内部使用,则在创建文本样式时还应指定包参数,如上面的示例所示。 包还可以提供字体文件,而无需输入pubspec Yaml。这些文件应位于包的lib/文件夹中。字体文件不会自动绑定到应用程序,应用程序可以在声明字体时选择性地使用这些字体。假设a_包中有一个包:

 flutter:
   fonts:
     - family: Raleway
       fonts:
         - asset: assets/fonts/Raleway-Regular.ttf
         - asset: packages/my_package/fonts/Raleway-Medium.ttf
           weight: 500

family是字体的名称。可以在TextStyle的fontFamily属性中使用它 资产相对于pubspec yaml文件的路径这些文件包含字体中的字形轮廓。构建应用程序时,这些文件将包含在应用程序的资产包中。 可以设置字体的粗细、倾斜和其他样式 weight属性指定字体的粗细。值范围是100到900(100的倍数)的整数。这些值对应于FontWeight,可用于TextStyle的FontWeight属性 样式指定字体是斜体还是普通字体。相应的值为斜体和普通值。这些值对应于fontStyle可用于TextStyle的fontStyle TextStyle属性

import 'package:flutter/material.dart';
const String words1 = "Almost before we knew it, we had left the ground.";
const String words2 = "A shining crescent far beneath the flying vessel.";
const String words3 = "A red flair silhouetted the jagged edge of a wing.";
const String words4 = "Mist enveloped the ship three hours out from port.";
void main() {
  runApp(new MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Fonts',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new FontsPage(),
    );
  }
}

在Flutter应用程序中使用字体需要两个步骤。首先在pubspec.yaml中声明它们,以确保它们包含在应用程序中。

以上就是Flutter项目手势运用及单独指针消歧问题解决方案的详细内容,更多关于Flutter手势运用单独指针消歧的资料请关注我们其它相关文章!

(0)

相关推荐

  • Flutter RendererBinding作用源码分析

    目录 分析 PipelineOwner flushLayout flushCompositingBits flushPaint flushSemantics initRenderView scheduleInitialLayout scheduleInitialPaint 分析 RendererBinding 的作用是负责render tree 和flutter engine之间的连接. 我们在启动App的时候,首先会创建 PiplineOwner ,然后通过platformDispatcher

  • Flutter手势密码的实现示例(附demo)

    目录 前言 开始 绘制圆点 绘制手势路径 组合9个圆点盘和手势路径 手势密码组件的使用 上传自定义组件到pub仓库 后记 前言 本篇记录的是使用Flutter完成手势密码的功能,大致效果如下图所示: 该手势密码的功能比较简单,下面会详细记录实现的过程,另外还会简单说明如何将该手势密码作为插件发布到pub仓库. 开始 实现上面的手势密码并不难,大致可以拆分成如下几部分来完成: 绘制9个圆点 绘制手指滑动的线路 合并以上两个部分 绘制圆点 我们使用面向对象的方式来处理9个圆点的绘制,每个圆点作为一个

  • 基于Flutter实现手势密码加密与解锁功能

    目录 前言 1.绘制静态图形 2.存储手势密码数据 3.添加手势交互 4.绘制.刷新密码线 5.加入密码错误动画 总结 前言 密码的由来:在公元前405年,由古希腊和斯巴达的战争中,由于斯巴达盟友波斯帝国背叛,导致古希腊和斯巴达两败俱伤,这时斯巴达抓了一个波斯国的信使,这个信使 没有任何情报,只有一条有着杂乱无章的希腊字母的普通腰带,最终斯巴达统帅破解了这条腰带,成功击败了希腊.这就是世界上最早的密码.同时也是世界上最早的解密. 密码在我们生活中无处不在,作为个人隐私的最后一道防线显得无比的重要

  • Flutter图片缓存管理ImageCache原理分析

    目录 引言 PaintingBinding 减少图片缓存 增大阀值 思考 引言 设计: 嗯? 这个图片点击跳转进详情再返回图片怎么变白闪一下呢?产品: 是啊是啊! 一定是个bug开发: 囧囧囧 在开发过程中, 也许你也遇到过这样一个场景. 进入一个页面后,前一个页面的图片都会闪白一下. 或者在列表中,加载很多列表项后,之前列表中的图片都需要重新加载.你有没有想过这一切的原因是什么呢? 没错! 它就是我们今天介绍的主人公 --- ImageCache 可能有些人对ImageCache还有些陌生,

  • Flutter实现手势识别功能详解方法

    目录 GestureDetector 点击事件 双击事件 长按事件 水平/垂直拖动事件 缩放事件 InkWell Ink Listener 案例 GestureDetector GestureDetector 是手势识别的组件,可以识别点击.双击.长按事件.拖动.缩放等手势 点击事件 点击相关事件包括: onTapDown:按下时回调. onTapUp:抬起时回调. onTap:点击事件回调. onTapCancel:点击取消事件回调. 按下然后抬起调用顺序 onTapDown-> onTapU

  • flutter消息推送客户端集成方案详解

    目录 一.背景 二.第三方消息推送——个推 1.简介 2.注册开通 3.自定义消息推送——透传 三.项目集成 1.个推客户端flutter插件 2.Android和IOS配置 1)Android 2) iOS 3.通知栏插件flutter_local_notifications 4.个推消息与通知栏整合 最后 一.背景 公司一个CRM APP项目是用Flutter写的,根据业务要求,需要集成消息推送功能.所谓的消息推送就是系统会根据某些行为自动推送信息,手机的通知栏会接收到信息,点击可以打开ap

  • Flutter框架解决盒约束widget和assets里加载资产技术

    目录 盒约束 文本输入widget assets 加载资产 盒约束 flutter: assets: - assets/my_icon.png - assets/background.png 在Flutter中,小部件由其底层RenderBox对象渲染.渲染框受其父对象的约束,并在这些约束下调整自身大小.约束包括最小宽度.最大宽度和高度:尺寸由特定的宽度和高度组成. 通常,根据小部件如何处理其约束,有三种类型的框: 尽可能大.例如,“Center”和“ListView”的渲染框 遵循子部件的大小

  • Flutter项目手势运用及单独指针消歧问题解决方案

    目录 对于手势的运用 单独指针 消歧 依赖包中的字体 对于手势的运用 指针表示用户与设备屏幕交互的原始数据.有四种类型的指针事件 PointerDownEvent指针触摸屏幕上的特定位置 PointerMoveEvent指针从屏幕上的一个位置移动到另一个位置 PointerUpEvent指针停止触摸屏幕 PointerCancelEvent指针的输入事件不再针对此应用程序(事件取消) Widget build(BuildContext context) { return new GestureD

  • Flutter项目在 iOS14 启动崩溃的解决方法

    Flutter是什么? Flutter是Google一个新的用于构建跨平台的手机App的SDK.写一份代码,在Android 和iOS平台上都可以运行. 下面看下Flutter项目在 iOS14 启动崩溃的问题及解决方法 崩溃现象 在iOS14发布之后,运行APP就出现闪退,和机型没关,只要是iOS 14就必闪退 崩溃分析 1.启动就闪退,多起几次可能有一次没有问题. 2.启动后到某个页面卡死(必卡跳不过) 根本原因尚不明确,个人分析Product Name会影响Header Folder Pa

  • flutter项目引入iconfont阿里巴巴图标

    目录 下载图标 使用图标 注意 下载图标 这里直接去iconfont阿里巴巴矢量图标库,选好自己需要的图标,点击如下图所示[添加到库] 然后选择头像左侧的购物车图标 然后点击下载代码 引入图标 解压完打开文件夹可以看到如下文件列表,我们将.ttf文件放在项目的静态资源文件夹中[我直接放在asset文件夹下] 接着我们在项目的pubspec.yaml文件夹下引入字体文件,并设置字体族名称 fonts: - family: Iconfont fonts: - asset: asset/fonts/i

  • Flutter学习笔记(二)创建一个flutter项目

    目录 开发环境 实践 运行 网络环境配置 (1)进入packages\flutter_tools\gradle 文件夹,然后打开flutter.gradle文件.目录如下图所示: (2)进入 flutter\packages\flutter_tools\gradle 文件夹,然后打开resolve_dependencies.gradle文件,目录如下: 本文就是利用androidstudio创建一个flutter项目并且成功运行起来.其中运行的过程,可能涉及到网络环境配置的问题.觉得过于简单的朋

  • 在Web项目中引入Jquery插件报错的完美解决方案(图解)

    在学习Jquery插件的时候,遇到一个问题就是新建web工程后在WebRoot下引入Jquery插件的时候报错,不知道为什么好纠结,但是项目能正常运行,后来找到解决方案,在这里给大家分享一下. 解决方案如下所示: 1.在MyEclipse软件中找打-----windows----preferences,会出现一个如下图所示的界面: 2.在检索框输入一个validation----单击该validation节点,将对于JavaScript脚本的验证取消勾,然后点击Apply,一直yes就行. 3.

  • IDEA中创建maven项目引入相关依赖无法下载jar问题及解决方案

    先如今idea中的spring项目,springBoot的项目的开发一般都是基于maven创建的项目.这大大简化我我们对于各种依赖包的管理,同时又使得各种依赖包方便管理.但是当maven中的依赖下载出现问题的时候也是很头痛. 问题场景 在公司的项目中用到了fastjson依赖,而依赖的版本是动态获取的,如图 但是在某天启动项目的时候报错,一查看原来是maven中fastjson依赖的原因, 这时大部分的人的操作应该和我一样: 操作1 点击maven的更新按钮,让maven自动下载对应的jar包到

  • Tomcat部署web项目出现http状态404未找到的详细解决方案

    问题描述: 当我们向tomcat服务器发起请求时,出现如下的错误状态提示–404.这个问题在开发过程中可能会经常遇到,所以做一个归纳总结: 以下的内容适用于IDEA,使用其他编辑器的小伙伴们需要注意区别. 情景① –> 访问的资源并不存在,仔细检查文件名与路径中的文件名是否一致,比如:hello.jsp写成了hallo.jsp. 情景② –> 虚拟路径没有写对,可以在配置tomcat里查看虚拟路径名,一般请求路径中包含虚拟路径名(也可以不包含),例如:http://localhost:8080

  • 详解Vue项目编译后部署在非网站根目录的解决方案

    同一个生产部署项目,基内外网的访问路径并不相同,内网是基于域名根目录来访问,而外网却指向了一个子目录. eg. : vue-router: history模式 内网环境:192.168.1.1:8080/index.html 外网环境:domain.com/ttsd/index.html 由于开发出来的项目是要部署在客户方,且客户并不想单独拿一个域名(或子域)来部署,这时,打包后的程序就要作一些配置方面的修改了. 修改配置文件 1.把打包后的资源引用修改为相对路径 找到 config/index

  • vue项目打包部署后默认路由不正确的解决方案

    目录 打包部署后默认路由不正确 问题描述 解决方案 vue打包后路径不对 对于背景图片不显示的问题 动画无法运行 小图标没了 打包部署后默认路由不正确 问题描述 vue项目本地开发的时候默认路由没问题,例如 redirect:"/index" 但是部署以后,服务器上默认路由不正确,现在遇到的问题是,会默认跳转到login页面,前提项目没有做路由权限. 解决方案 打开路由index.js文件,添加:base:"/" const routers = new Router

随机推荐