我需要在手机上很好地滚动我的应用程序,但我似乎无法获得所需的响应能力。我想要实现的一个例子是 VKontakte 应用程序,在那里实现了非常酷的滚动,但我什至无法接近他们的水平。目前我正在像这样实现它:
public void gestureDetector() {
gestureDetector = new GestureDetector(new GestureDetector.GestureListener() {
@Override
public boolean touchDown(float x, float y, int pointer, int button) { //если палец на экране
smoothScroll = false;
return false;
}
@Override
public boolean pan(float x, float y, float deltaX, float deltaY) {
smoothScroll = true;
//если позиция камеры не уходит за пределы, то мы продолжаем передавать -deltaY
if (camera.position.y < HEIGHT/2 && deltaY < 0) { //если позиция камеры ушла за предел и скроллинг идет вниз, мы не даем ему идти дальше
deltaY = 0;
smoothScroll = false;
} else if (camera.position.y > 2000 + HEIGHT/2 && deltaY > 0) { //если позиция камеры ушла за предел и скроллинг идет вверх, мы не даем ему идти дальше
deltaY = 0;
smoothScroll = false;
}
if (deltaY > 30f) deltaY = 30f; //ограничитель скорости прокрутки
if (deltaY < -30f) deltaY = -30f; //ограничитель скорости прокрутки
pan = deltaY; //передаем последующей прокрутке значение текущей скорости прокрутки
camera.translate(0, deltaY); //ручное перемещение камеры
camerast.translate(0, -deltaY);
camera.update(); //обновление камеры
camerast.update();
return true;
}
}
private void smoothScroll() {
if (!gestureDetector.isPanning()) { //если он не перемещается
if (smoothScroll) {
if ((int) pan == 0) { //если скорость прокрутки примерно равна нулю, то останавливаем ее
pan = 0;
smoothScroll = false;
}
if (pan > 0) {
pan = pan - Gdx.graphics.getDeltaTime() * 25;
} else if (pan < 0) {
pan = pan + Gdx.graphics.getDeltaTime() * 25;
}
if (camera.position.y < HEIGHT/2 && pan < 0) { //если позиция камеры ушла за предел и скроллинг идет вниз, мы не даем ему идти дальше
pan = 0;
smoothScroll = false;
} else if (camera.position.y > 2000 + HEIGHT/2 && pan > 0) { //если позиция камеры ушла за предел и скроллинг идет вверх, мы не даем ему идти дальше
pan = 0;
smoothScroll = false;
}
camera.translate(0, pan); //перемещение камеры
camerast.translate(0, -pan);
camera.update(); //обновление камер
camerast.update();
}
}
}
这个问题并不完全清楚。对什么特别感兴趣?我不能推荐具体的公式,但我建议你使用 SimpleGestureListener
创建 View 时,我们会创建一个处理事件的 GestureDetector
在 onTochEvent 中,我们使用 GestureDetector 处理事件
在 onScroll 中我们只是简单的移动视图,这个方法每秒调用 30-60 次(每帧),动画是没有意义的。
例如,在 onFling 中,我们创建了一个 ValueAnimator,它将值从 1f 更改为 0f,并通过在 onFling 中获得的速度向量乘以 animator 的值来滚动视图。通过更改动画插值器,您将改变投掷的惯性。限制最大初始速度向量也是值得的,因为 它可以通过一点灵巧达到巨大的价值。但这已经通过实验确立