首页 > 解决方案 > 如何减慢速度,ScrollPhysics Flutter

问题描述

我创建了一个 Listview,可以在每个给定时刻获取速度和距离。但是速度不会改变,并且在第一次滑动时是恒定的。如何让速度减慢并最终停止。

如果你运行它,它将显示我希望应用程序的外观,速度最终应该会变慢(但显示速度和距离)。

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:math' as math;

Future<void> main () async => runApp(MyApp());  ///Becasue of using layout builder widget as scaffold.

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
          return Material(
            color: Colors.black38,
            child: Center(
              child: ConstrainedBox(
                constraints: BoxConstraints(
                  maxWidth: 400.0,
                  maxHeight: constraints.maxHeight,
                ),
                child: ListView.builder(
                  //physics: CustomScrollPhysics(), Added this in the next part 
                  itemExtent: 250.0,  ///each box take specif space
                  itemBuilder: (BuildContext context, int index) => Container(
                    padding: EdgeInsets.symmetric(vertical: 9.0),
                    child: Material(
                      elevation: 4.0,
                      borderRadius: BorderRadius.circular(5.0),
                      color:
                      index % 2 == 0 ? Colors.cyan: Colors.deepOrange,
                      child: Center(
                        child: Text(index.toString()),
                      ),
                    ),
                  ),

                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

下面的方法是我用来获取速度和距离的方法。速度是恒定的(我需要它像上面的代码一样改变)。与上面相同的代码以及一些附加代码。

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:math' as math;

Future<void> main () async => runApp(MyApp());  ///Becasue of using layout builder widget as scaffold.

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
          return Material(
            color: Colors.black38,
            child: Center(
              child: ConstrainedBox(
                constraints: BoxConstraints(
                  maxWidth: 400.0,
                  maxHeight: constraints.maxHeight,
                ),
                child: ListView.builder(
                  physics: CustomScrollPhysics(),
                  itemExtent: 250.0,  ///each box take specif space
                  itemBuilder: (BuildContext context, int index) => Container(
                    padding: EdgeInsets.symmetric(vertical: 9.0),
                    child: Material(
                      elevation: 4.0,
                      borderRadius: BorderRadius.circular(5.0),
                      color:
                      index % 2 == 0 ? Colors.cyan: Colors.deepOrange,
                      child: Center(
                        child: Text(index.toString()),
                      ),
                    ),
                  ),

                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

class CustomSimulation extends Simulation {
  final double initPosition;
  final double velocity;

  CustomSimulation({required this.initPosition, required this.velocity});

  @override
  double x(double time) {
    var max =
    math.max(math.min(initPosition, 0.0), initPosition + velocity * time);

    // print(max.toString());
    var distance = (time * velocity);
    var Velocity_live = (distance/time);

    print("Distance is $distance");
    print("Velocity is $Velocity_live");

    return max;
  }

  @override
  double dx(double time) {
    // print(velocity.toString());
    return velocity;
  }

  @override
  bool isDone(double time) {
    return false;
  }
}

class CustomScrollPhysics extends ScrollPhysics {
  @override
  ScrollPhysics applyTo(ScrollPhysics? ancestor) {
    return CustomScrollPhysics();
  }

  @override
  Simulation createBallisticSimulation(
      ScrollMetrics position, double velocity) {
    return CustomSimulation(
      initPosition: position.pixels,
      velocity: velocity,
    );
  }
}

任何帮助,将不胜感激!

标签: flutterandroid-studiodartlistviewphysics

解决方案


推荐阅读