flutter - 如何减慢速度,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,
);
}
}
任何帮助,将不胜感激!
解决方案
推荐阅读
- python - 相应地获取模型的所有布尔值
- docker - 用于 docker 安装的 Wsl 更新
- tsql - 为什么在完全隔离的情况下@@rowcount 等于 1?
- opengl - OpenGL - 修改纹理参数
- python - (PyQT)当许多元素连接到回调函数时,如何获取哪个元素触发了回调函数?
- c++ - 从派生类访问成员函数的基类指针向量?正确的方法?
- loops - ReadString 读取 EOF 时如何中断循环?
- python - NLTK 不能在带有 KivyMD 的 Android Buildozer 应用程序中工作
- assembly - 具有两个大小为 10 的整数数组 X 和 Y 的汇编程序,其中 Y 包含:如果 X 中的元素为正,则为 1,如果该元素 < = 0,则为 0
- groovy - Groovy,检查数组中的所有元素是否包含子字符串