欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入了解Android中GestureDetector的定義與使用

 更新時間:2023年01月31日 11:36:40   作者:程序那些事  
Android中的GestureDetector?可以使用?MotionEvents?檢測各種手勢和事件,非常的好用。本文將會通過幾個具體的例子來講解一下GestureDetector的具體使用方法,需要的可以參考一下

簡介

之前我們介紹了GestureDetector的定義和其提供的一些基本的方法,GestureDetector的好處就是可以把任何一個widget都賦予類似button的功能。

今天將會通過幾個具體的例子來講解一下GestureDetector的具體使用。

賦予widget可以點擊的功能

一般情況下,我們的普通widget,比如文本是不能進行交互的,但是如果將其用GestureDetector進行包裝之后,就可以將其偽裝成為一個button。

比如我們有這樣一個偽裝成button的Container:

Container(
        padding: const EdgeInsets.all(12.0),
        decoration: BoxDecoration(
          color: Colors.green,
          borderRadius: BorderRadius.circular(8.0),
        ),
        child: const Text('My Button'),
      )

這個Container的本質是一個Text,這個Container本身是沒有交互功能的,那么如何對其添加交互功能呢?

最簡單的辦法就是將其使用GestureDetector包裝起來,如下所示:

GestureDetector(
      // The custom button
      child: Container(
        padding: const EdgeInsets.all(12.0),
        decoration: BoxDecoration(
          color: Colors.green,
          borderRadius: BorderRadius.circular(8.0),
        ),
        child: const Text('My Button'),
      ),
    )

接下來我們還要為其添加對應的手勢,這里我們添加一個onTap方法,

GestureDetector(
      onTap: ()=> showDialog<String>(
        context: context,
        builder: (BuildContext context) => AlertDialog(
          title: const Text('基本手勢'),
          content: const Text('這是基本的手勢,你學會了嗎?'),
          actions: <Widget>[
            TextButton(
              onPressed: () => Navigator.pop(context, 'Cancel'),
              child: const Text('Cancel'),
            ),
            TextButton(
              onPressed: () => Navigator.pop(context, 'OK'),
              child: const Text('OK'),
            ),
          ],
        ),
      ),
      ...

這里onTap會調用一個showDialog來彈出一個對話框,運行之后結果如下:

會動的組件

在上面的例子中,我們用手去tap按鈕是沒有互動效果的,也就是說按鈕是不會變化的。

那么有沒有可能模擬手指的按壓效果呢?

答案是肯定的,flutter為我們提供了一個InkWell組件,這樣手指按壓下組件會產生波紋的效果。

那么InkWell和GestureDetector有什么聯(lián)系呢?

InkWell和GestureDetector很類似,都提供了對手勢的支持。

在InkWell中提供了多種GestureTapCallback接口,用接收手勢的回調,非常的方便。

在使用上,InkWell和GestureDetector也很類似,我們可以完全照搬GestureDetector的用法。

還是上面的例子,我們可以將GestureDetector替換成為InkWell,如下所示:

  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
          content: Text('Tap'),
        ));
      },
      child: const Padding(
        padding: EdgeInsets.all(12.0),
        child: Text('Flat Button'),
      ),
    );
  }

這里,為了更好的觀察手勢按壓之后的效果,這里onTap選擇展示一個flutter自帶的SnackBar。

可刪除的組件

在app中的手勢應用上,有一個比較常見的用法就是在list列表中,向左滑動一個item,會出現刪除的按鈕,這種滑動刪除的效果,如何在flutter中實現呢?

flutter提供了一個Dismissible的組件來實現這個效果。

我們先來看下Dismissible的定義:

class Dismissible extends StatefulWidget {
    const Dismissible({
    required Key key,
    required this.child,
    this.background,
    this.secondaryBackground,
    this.confirmDismiss,
    this.onResize,
    this.onUpdate,
    this.onDismissed,
    this.direction = DismissDirection.horizontal,
    this.resizeDuration = const Duration(milliseconds: 300),
    this.dismissThresholds = const <DismissDirection, double>{},
    this.movementDuration = const Duration(milliseconds: 200),
    this.crossAxisEndOffset = 0.0,
    this.dragStartBehavior = DragStartBehavior.start,
    this.behavior = HitTestBehavior.opaque,
  }) : assert(key != null),
       assert(secondaryBackground == null || background != null),
       assert(dragStartBehavior != null),
       super(key: key);

可以看到Dismissible是一個StatefulWidget,它有兩個必須的參數分別是key和child。

key用來標記要刪除item的id,child是可以滑動刪除的組件。

為了演示方便,我們使用ListView來展示如何使用Dismissible。

首先我們構建一個items的list,里面包含了每個item要展示的內容:

 final items = List<String>.generate(10, (i) => '動物 ${i + 1}');

然后使用ListView的builder方法來構建items。并且將每個items封裝到Dismissible中去:

body: ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) {
            final item = items[index];
            return Dismissible(
              key: Key(item),
              onDismissed: (direction) {
                setState(() {
                  items.removeAt(index);
                });
                ScaffoldMessenger.of(context)
                    .showSnackBar(SnackBar(content: Text('$item 被刪除了')));
              },
              child: ListTile(
                title: Text(item),
              ),
            );
          },
        )

這里Dismissible的child是ListTile組件,里面的具體內容就是Text。

現在Dismissible實際上就可以工作了,當你滑動ListTile的時候,對應的item就會被刪除。

為了明顯起見,我們可以給Dismissible添加一個background屬性,這樣滑動刪除的時候就有了一個背景顏色:

background: Container(color: Colors.red),

另外,Dismissible還有一個confirmDismiss屬性,可以用來判斷是否真的要滑動刪除,比如我們只允許從右到左滑動刪除,那么可以這樣做:

Dismissible(
  ...
confirmDismiss:confirmResult,
...
)

  Future<bool> confirmResult(DismissDirection direction) async {
    if(direction == DismissDirection.endToStart){
      return true;
    }
    return false;
  }

這里的confirmResult是一個異步函數,它接收一個DismissDirection的參數,這個參數表示的是滑動刪除的方向,我們可以通過這個方向來判斷是否真正的進行刪除操作。

總結

以上就是日常手勢的基本使用了,我們可以通過GestureDetector,InkWell和Dismissible來和手勢進行結合來實現相應的功能。

到此這篇關于深入了解Android中GestureDetector的定義與使用的文章就介紹到這了,更多相關Android GestureDetector內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android 實現背景圖和狀態(tài)欄融合方法

    Android 實現背景圖和狀態(tài)欄融合方法

    下面小編就為大家分享一篇Android 實現背景圖和狀態(tài)欄融合方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Android pcm轉wav格式方法

    Android pcm轉wav格式方法

    本篇文章主要給大家講述了在Android開發(fā)中將pcm格式轉wav格式的方法和代碼實例,需要的朋友跟著學習下吧。
    2017-12-12
  • Android 仿支付寶中的余額寶收益進度條

    Android 仿支付寶中的余額寶收益進度條

    這篇文章主要介紹了Android 仿支付寶中的余額寶收益進度條的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • Android TelephonyManager詳解及實現代碼

    Android TelephonyManager詳解及實現代碼

    本文主要介紹Android TelephonyManager, 這里整理了關于Android TelephoneManager的相關資料,并附有示例代碼和實現效果圖,有需要的朋友可以參考下
    2016-08-08
  • Android仿京東首頁畫軸效果

    Android仿京東首頁畫軸效果

    這篇文章主要為大家詳細介紹了Android仿京東首頁畫軸效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android實現滑動屏幕切換圖片

    Android實現滑動屏幕切換圖片

    這篇文章主要為大家詳細介紹了Android實現滑動屏幕切換圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Android Studio 當build時候出錯解決辦法

    Android Studio 當build時候出錯解決辦法

    這篇文章主要介紹了 Android Studio在build的時候出現transformClassesWithDexForDebug錯誤解決辦法的相關資料,需要的朋友可以參考下
    2017-05-05
  • Android  View自定義鎖屏圖案

    Android View自定義鎖屏圖案

    這篇文章主要為大家詳細介紹了Android View自定義鎖屏圖案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 基于Android本地代碼生成器詳解

    基于Android本地代碼生成器詳解

    本篇文章是對Android本地代碼生成器的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Android實現Activity水平和垂直滾動條的方法

    Android實現Activity水平和垂直滾動條的方法

    這篇文章主要介紹了Android實現Activity水平和垂直滾動條的方法,涉及Activity的ScrollView設置相關技巧,需要的朋友可以參考下
    2016-07-07

最新評論