• 09、Flutter手势控制


    手势控制

    Flutter中提供手势检测为GestureDetector。手势系统分为两层,第一层是触摸原事件(指针),有相应的四种事件类型:

    PointerDownEvent:用户与屏幕接触产生了联系。
    PointerMoveEvent:手指已从屏幕上的一个位置移动到另一个位置。
    PointerUpEvent:用户已停止接触屏幕。
    PointerCancelEvent:此指针的输入不再指向此应用程序。

    第二层就是我们可以检测到的手势,主要分为三大类,包括轻击、拖动和缩放。

    GestureDetector手势

    GestureDetector可以进行手势检测,比如点击一次、双击、长按、垂直拖动及水平拖动等。

    事件名 描述
    onTapDown 点击屏幕立即触发此方法
    onTapUp 手指离开屏幕
    onTap 点击屏幕
    onTapCancel 此次点击事件结果,onTapDown不会再产生点击事件
    onDoubleTap 用户快速连续两次在同一个位置点击屏幕
    onLongPress 长时间保持与相同位置的屏幕接触
    onVerticalDragStart 与屏幕接触,可能会开始垂直移动
    onVerticalDragUpdate 与屏幕接触并垂直移动的指针在垂直方向上移动
    onVerticalDragEnd 之前与屏幕接触并垂直移动的指针不再与屏幕接触,并且停止接触屏幕时以特定速度移动垂直拖动
    onHorizontalDragStart 与屏幕接触,可能开始水平移动
    onHorizontalDragUpdate 与屏幕接触并水平移动的指针在水平方向上移动
    onHorizontalDragEnd 先前与屏幕接触并且水平移动的指针不再与屏幕接触,并且当它停止接触屏幕时以特定速度移动水平拖动

    假设我们想要制作一个自定义按钮,当点击时显示文字‘你已按下’。请看下面示例代码:

    import 'package:flutter/material.dart';
    void main() => runApp(
      MaterialApp(
        title: 'GestureDetector示例',
        home: MyApp(),
      )
    );
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('GestureDetector示例'),),
          body: Center(child: MyButton(),),
        );
      }
    }
    class MyButton extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // 一定要把触摸的组件放在GestureDetector里面
        return GestureDetector(
          onTap: (){
            // 底部消息提示
            final snackBar = new SnackBar(content: Text('你已按下'));
            Scaffold.of(context).showSnackBar(snackBar);
          },
          // 添加容器接收触摸动作
          child: Container(
            padding: EdgeInsets.all(12.0),
            decoration: BoxDecoration(
              color: Theme.of(context).buttonColor,
              borderRadius: BorderRadius.circular(10.0),
            ),
            child: Text('测试按钮'),
          ),
        );
      }
    }
    

    Dismissible滑动删除

    滑动删除模式在移动应用中很常见,Flutter通过提供Dismissible组件使这项任务变得简单。

    属性名 类型 说明
    onDismissed DismissDirectionCallback 当包裹的组件消失后回调的函数
    movementDuration Duration 定义组件消息的时长
    onResize VoidCallBack 组件大小改变时回调的函数
    resizeDuration Duration 组件大小改变时长
    child Widget 组件包裹的子元素,即被隐藏的对象

    编写一个示例,可以删除列表中某一项数据。其中关键部分是列表项需要使用Dismissible包裹。

    import 'package:flutter/material.dart';
    void main() => runApp(
      MaterialApp(
        title: 'Dismissible滑动删除',
        home: MyApp(),
      )
    );
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context) {
        List<String> items = new List.generate(30, (index) => "列表项 ${index + 1}");
        return Scaffold(
          appBar: AppBar(title: Text('Dismissible滑动删除'), centerTitle: true,),
          // 构建列表
          body: ListView.builder(
            itemCount: items.length,
            itemBuilder: (context, index){ // 构建列表
              // 提取出被删除的项
              final item = items[index];
              // 返回一个可以被删除的列表项
              return Dismissible(
                key: Key(item),
                // 被删除回调
                onDismissed: (direction){
                  // 移除制定索引项
                  items.removeAt(index);
                  // 底部弹出消息提示当前项被删除
                  Scaffold.of(context).showSnackBar(SnackBar(content: Text('$item被删除了'),));
                },
                child: ListTile(title: Text('$item'),),
              );
            },
          ),
        );
      }
    }
    
  • 相关阅读:
    2-2. 然后是几点(15)
    2-1. 厘米换算英尺英寸(15)
    2-0. 整数四则运算(10)
    忙碌的下半学期
    ACM 第十九天
    ACM 第十八天
    ACM 第十七天
    凸包模板
    极角排序常用方法
    ACM 第十六天
  • 原文地址:https://www.cnblogs.com/pengjingya/p/14929299.html
Copyright © 2020-2023  润新知