gpt4 book ai didi

java - 具有惯性和边缘阻力/回弹的平滑滚动

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:51:27 26 4
gpt4 key购买 nike

我通过触摸拖动和多点触控缩放为自定义 View 实现了基本滚动。这很好用,但现在我想添加一些高级功能。

例如,在谷歌地图应用中,当你在屏幕上拖动时,停止拖动后它仍然会继续移动一点(惯性)。一些浏览器(例如 iPad Safari)允许您将屏幕拖动到比网站可见区域更远的位置,但随后屏幕会迅速弹回到网站的边缘。

我现在想实现类似的东西,但要做到这一点,我需要在触摸事件定期发生后更改 Activity 屏幕区域以执行动画。我该怎么做?

最佳答案

使用 OnGestureListener .要提供平滑滚动,请创建一个滚动条(在您的自定义 View 中)。当手势监听器检测到一个滑动事件时,设置滚动条。然后,覆盖自定义 View 的 computeScroll() 方法。

查看此示例以了解如何实现它。

int lastX;
int lastY;
Scroller scroller;
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
if (!scrolledLastFrame) {
lastX = scroller.getStartX();
lastY = scroller.getStartY();
}

int dx = scroller.getCurrX() - lastX;
int dy = scroller.getCurrY() - lastY;

lastX = scroller.getCurrX();
lastY = scroller.getCurrY();

doScroll(dx, dy);
scrolledLastFrame = true;
} else {
scrolledLastFrame = false;
}

}

public void doFling(int startX, int startY, int velocityX, int velocityY,
int minX, int maxX, int minY, int maxY) {
scroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
invalidate();
}

public void doScroll(int dx, int dy) {
currentX+=dx;
currentY+=dy;

invalidate();
}

private class ProgramGestureListener extends SimpleOnGestureListener {

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {

doScroll(distanceX, distanceY);
return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int max_left = getMaxHorizontalScroll();
int max_top = getMaxVerticalScroll();
int min_left = getMinHorizontalScroll();
int min_top = getMinVerticalScroll();

int startX = getCurrentHorizontalScroll();
int startY = getCurrentVerticalScroll();

doFling(startX, startY, (int) -velocityX, (int) -velocityY,
min_left, max_left, min_top, max_top);

return true;
}
}

关于java - 具有惯性和边缘阻力/回弹的平滑滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5003069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com