最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android?Flutter實(shí)現(xiàn)彈簧動(dòng)畫交互的示例詳解

 更新時(shí)間:2023年04月28日 09:16:28   作者:早起的年輕人  
物理模擬可以讓應(yīng)用程序的交互感覺逼真和互動(dòng),本文章實(shí)現(xiàn)了演示了如何使用彈簧模擬將小部件從拖動(dòng)的點(diǎn)移回中心,感興趣的可以了解一下

物理模擬可以讓應(yīng)用程序的交互感覺逼真和互動(dòng),例如,你可能希望為一個(gè) Widget 設(shè)置動(dòng)畫,使其看起來像是附著在彈簧上或是重力下落。本文章實(shí)現(xiàn)了演示了如何使用彈簧模擬將小部件從拖動(dòng)的點(diǎn)移回中心。

實(shí)現(xiàn)步驟如下

  • 設(shè)置動(dòng)畫控制器
  • 使用手勢移動(dòng)小部件
  • 為小部件制作動(dòng)畫
  • 計(jì)算速度以模擬彈簧運(yùn)動(dòng)

1.創(chuàng)建一個(gè)動(dòng)畫控制器

首頁創(chuàng)建一個(gè)測試使用的Demo頁面

void main() {
  runApp(const MaterialApp(home: PhysicsCardDragDemo()));
}
class PhysicsCardDragDemo extends StatelessWidget {
  const PhysicsCardDragDemo({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: const DraggableCard(
        child: FlutterLogo(
          size: 128,
        ),
      ),
    );
  }
}

DraggableCard 是自定義的一個(gè) StatefulWidget,代碼如下:

class _DraggableCardState extends State<DraggableCard> {
  @override
  void initState() {
    super.initState();
  }
  @override
  void dispose() {
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Align(
      child: Card(
        child: widget.child,
      ),
    );
  }
}

然后在 _DraggableCardState 中創(chuàng)建一個(gè)動(dòng)畫控制器,并在頁面銷毀的時(shí)候釋放動(dòng)畫控制器,代碼如下:

class _DraggableCardState extends State<DraggableCard>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  @override
  void initState() {
    super.initState();
    _controller =  AnimationController(vsync: this, duration: const Duration(seconds: 1));
  }
  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Align(
      child: Card(
        child: widget.child,
      ),
    );
  }
}

SingleTickerProviderStateMixin是用來在StatefulWidget中管理單個(gè)AnimationController的Mixin;它提供了一個(gè)TickerProvider,用于將AnimationController與TickerProviderStateMixin一起使用。

TickerProviderStateMixin提供了一個(gè)Ticker,它可以在每個(gè)frame中調(diào)用AnimationController的方法,這使得AnimationController可以在每個(gè)frame中更新動(dòng)畫。

2.使用手勢移動(dòng)Widget

在 _DraggableCardState 中,結(jié)合使用 Alignment 與 GestureDetector,代碼如下:

class _DraggableCardState extends State<DraggableCard>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  Alignment _dragAlignment = const Alignment(0, 0);
  @override
  Widget build(BuildContext context) {
    var size = MediaQuery.of(context).size;
    return GestureDetector(
      onPanDown: (details) {},
      onPanUpdate: (details) {
        _dragAlignment += Alignment(
          details.delta.dx / (size.width / 2),
          details.delta.dy / (size.height / 2),
        );
        setState(() {
        });
      },
      onPanEnd: (details) {},
      child: Align(
        alignment: _dragAlignment,
        child: Card(
          child: widget.child,
        ),
      ),
    );
  }

GestureDetector用來檢測手勢,例如輕觸、滑動(dòng)、拖動(dòng)等,可以用來實(shí)現(xiàn)各種交互效果。

Alignment用于控制子widget在父widget中的位置??梢酝ㄟ^Alignment的構(gòu)造函數(shù)來指定子widget相對于父widget的位置,如Alignment.topLeft表示子widget位于父widget的左上角。也可以通過FractionalOffset來指定子widget相對于父widget的位置,如FractionalOffset(0.5, 0.5)表示子widget位于父widget的中心。Alignment還可以與Stack一起使用,實(shí)現(xiàn)多個(gè)子widget的定位。

3.創(chuàng)建一個(gè)動(dòng)畫Widget

我們需要實(shí)現(xiàn),當(dāng)手指抬起時(shí),被移動(dòng)的 Widget 動(dòng)畫的方式彈回去。

在這里需要一個(gè) Animation ,再定義一個(gè) runAnimation 方法,同時(shí)為 第一步創(chuàng)建的動(dòng)畫控制器添加一個(gè)更新監(jiān)聽。

class _DraggableCardState extends State<DraggableCard>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Alignment> _animation;
  @override
  void initState() {
    super.initState();
    _controller =
        AnimationController(vsync: this, duration: const Duration(seconds: 1));
    _controller.addListener(() {
      setState(() {
        _dragAlignment = _animation.value;
      });
    });
  }
  void _runAnimation() {
    _animation = _controller.drive(
      AlignmentTween(
        begin: _dragAlignment,
        end: Alignment.center,
      ),
    );
    _controller.reset();
    _controller.forward();
  }
 }

然后在手指抬起的時(shí)候,執(zhí)行動(dòng)畫,將被移動(dòng)的 Widget (如這里的圖片)以動(dòng)畫的方式移動(dòng)回原位:

@override
  Widget build(BuildContext context) {
    var size = MediaQuery.of(context).size;
    return GestureDetector(
      onPanDown: (details) {
        _controller.stop();
      },
      onPanUpdate: (details) {
        _dragAlignment += Alignment(
          details.delta.dx / (size.width / 2),
          details.delta.dy / (size.height / 2),
        );
        setState(() {
        });
      },
      onPanEnd: (details) {
        _runAnimation();
      },
      child: Align(
        alignment: _dragAlignment,
        child: Card(
          child: widget.child,
        ),
      ),
    );
  }

4.計(jì)算速度以模擬彈簧運(yùn)動(dòng)

最后一步是做一些數(shù)學(xué)運(yùn)算,計(jì)算小部件完成拖動(dòng)后的速度。這是為了使小部件在被拍回之前能夠以這種速度逼真地繼續(xù)。(_runAnimation方法已經(jīng)通過設(shè)置動(dòng)畫的開始和結(jié)束對齊來設(shè)置方向。)

導(dǎo)入包如下:

import 'package:flutter/physics.dart';

onPanEnd回調(diào)提供了一個(gè)DragEndDetails對象。此對象提供指針停止接觸屏幕時(shí)的速度。速度以像素每秒為單位,但Align小部件不使用像素。它使用介于[-1.0,-1.0]和[1.0,1.0]之間的坐標(biāo)值,其中[0.0,0.0]表示中心。步驟2中計(jì)算的大小用于將像素轉(zhuǎn)換為該范圍內(nèi)的坐標(biāo)值。

然后修改 runAnimation 執(zhí)行動(dòng)畫函數(shù)如下:

void _runAnimation(Offset pixelsPerSecond, Size size) {
    _animation = _controller.drive(
      AlignmentTween(
        begin: _dragAlignment,
        end: Alignment.center,
      ),
    );
    final unitsPerSecondX = pixelsPerSecond.dx / size.width;
    final unitsPerSecondY = pixelsPerSecond.dy / size.height;
    final unitsPerSecond = Offset(unitsPerSecondX, unitsPerSecondY);
    final unitVelocity = unitsPerSecond.distance;
   //它可以用于模擬彈簧的阻尼、質(zhì)量和剛度等屬性,從而實(shí)現(xiàn)更加真實(shí)的動(dòng)畫效果。
    const spring = SpringDescription(
      mass: 30,
      stiffness: 1,
      damping: 1,
    );
    //SpringSimulation用來模擬一個(gè)彈簧的運(yùn)動(dòng),可以用于創(chuàng)建具有彈性的動(dòng)畫效果。
    final simulation = SpringSimulation(spring, 0, 1, -unitVelocity);
    _controller.animateWith(simulation);
  }

然后在手指抬起的時(shí)候調(diào)用

onPanEnd: (details) {
    _runAnimation(details.velocity.pixelsPerSecond, size);
  },

以上就是Android Flutter實(shí)現(xiàn)彈簧動(dòng)畫交互的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Android Flutter彈簧動(dòng)畫交互的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android實(shí)現(xiàn)粒子漩渦動(dòng)畫

    Android實(shí)現(xiàn)粒子漩渦動(dòng)畫

    粒子動(dòng)畫經(jīng)常用于大畫幅的渲染效果,實(shí)際上難度并不高,但是在使用粒子動(dòng)畫時(shí),必須要遵循的一些要素,起點(diǎn),矢量速度和符合運(yùn)動(dòng)學(xué)公式等,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Android進(jìn)階教程之ViewGroup自定義布局

    Android進(jìn)階教程之ViewGroup自定義布局

    這篇文章主要給大家介紹了關(guān)于Android進(jìn)階教程之ViewGroup自定義布局的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 安卓GreenDao框架一些進(jìn)階用法整理

    安卓GreenDao框架一些進(jìn)階用法整理

    本文主要對安卓GreenDao框架一些進(jìn)階用法進(jìn)行整理介紹,具有一定的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • Android開發(fā)實(shí)現(xiàn)webview中img標(biāo)簽加載本地圖片的方法

    Android開發(fā)實(shí)現(xiàn)webview中img標(biāo)簽加載本地圖片的方法

    這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)webview中img標(biāo)簽加載本地圖片的方法,結(jié)合實(shí)例形式分析了webview加載本地圖片的步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • android使用ExpandableListView控件實(shí)現(xiàn)小說目錄效果的例子

    android使用ExpandableListView控件實(shí)現(xiàn)小說目錄效果的例子

    這篇文章主要介紹了android使用ExpandableListView控件實(shí)現(xiàn)小說目錄效果的例子,還可以實(shí)現(xiàn)二級列表展示效果,需要的朋友可以參考下
    2014-07-07
  • Kotlin協(xié)程之Flow的使用與原理解析

    Kotlin協(xié)程之Flow的使用與原理解析

    Flow是一種數(shù)據(jù)流,可以用于協(xié)程間的通信,具有冷、懶、響應(yīng)式等特點(diǎn),Flow是基于協(xié)程構(gòu)建的,可以提供多個(gè)值,本文就來給大家講講Kotlin Flow使用與原理,需要的朋友可以參考下
    2023-09-09
  • Android使用AudioRecord實(shí)現(xiàn)暫停錄音功能實(shí)例代碼

    Android使用AudioRecord實(shí)現(xiàn)暫停錄音功能實(shí)例代碼

    本篇文章主要介紹了Android使用AudioRecord實(shí)現(xiàn)暫停錄音功能實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-06-06
  • Android?獲取實(shí)時(shí)網(wǎng)速實(shí)現(xiàn)詳解

    Android?獲取實(shí)時(shí)網(wǎng)速實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Android?獲取實(shí)時(shí)網(wǎng)速實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android實(shí)現(xiàn)多級樹形選擇列表

    Android實(shí)現(xiàn)多級樹形選擇列表

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)多級樹形選擇列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Android手機(jī)顯示多彩霓虹燈效果

    Android手機(jī)顯示多彩霓虹燈效果

    這篇文章主要為大家詳細(xì)介紹了Android手機(jī)顯示多彩霓虹燈效果的小實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

思茅市| 虎林市| 潼南县| 昭平县| 保靖县| 崇州市| 湘西| 临漳县| 石嘴山市| 镇原县| 冷水江市| 德安县| 阳原县| 南宫市| 南丹县| 金湖县| 青河县| 义马市| 漾濞| 内江市| 浮梁县| 黔西| 泰安市| 西乡县| 大悟县| 玉田县| 通许县| 玛多县| 南陵县| 益阳市| 临夏市| 崇明县| 新田县| 会理县| 昌平区| 漳平市| 峨眉山市| 青铜峡市| 锡林浩特市| 杭州市| 博兴县|