当前位置: 首页 > 面试题库 >

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

柯镜
2023-03-14
问题内容

我通过触摸拖动和多点触摸缩放实现了自定义视图的基本滚动。效果很好,但是现在我想添加一些高级功能。

例如,在Google Maps应用程序中,当您在屏幕上拖动时,停止拖动后,它仍会继续移动一点(惯性)。并且某些浏览器(例如IPad
Safari)允许您将屏幕拖动到网站可见区域以外的地方,但随后屏幕将迅速回到网站边缘。

我现在想实现类似的功能,但是要做到这一点,我需要在定期发生触摸事件 更改活动屏幕区域以执行动画。我怎样才能做到这一点?


问题答案:

使用OnGestureListener。要提供平滑的滚动,请创建一个滚动器(在您的自定义视图中)。当手势侦听器检测到猛击事件时,将滚动器设置为向上。然后,重写自定义视图的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;
    }
  }


 类似资料:
  • 这是我的测试照片 我正在努力寻找卡片的边缘。但是,正如您所看到的,边缘有些模糊。 在这里找到一些建议:模糊边缘检测如何从python中的模糊图像中找到扭曲矩形的精确角点位置?,但没有一个能产生令人满意的边缘。 完整代码:

  • 我想实现像Google Play App一样的平滑滚动行为。我尝试过这里提到的解决方案: 解决方案1 解决方案2 解决方案3 但所有上述解决方案都没有像在Google Play应用程序中那样给出预期的结果。以下是xml代码: 如何实现平滑滚动? 编辑:以下是recyclerview适配器 }

  • 问题内容: 我的后退滑动功能有效,但仅在屏幕边缘有效。如何在屏幕上的任何地方工作? 问题答案: 苹果在这里说: InteractivePopGestureRecognizer 手势识别器负责将顶视图控制器从导航堆栈中弹出。(只读) @property(非原子,只读)UIGestureRecognizer * interactivePopGestureRecognizer 导航控制器将此手势识别器安

  • Haskell库中是否存在这种数据结构?我做了一些搜索,但找不到任何有用的东西。我想使用现有的类型,而不是定义我自己的类型——它似乎应该存在。 这个想法是它与Data. Tree非常相似,但是边可以保存信息和节点。 如果你有一个通过树的路径(类型为[e]),你可以在O(log(n))中找到rootLabel(类型为n)。据我所知,你不能用Data做这件事。树,因为您必须扫描每个节点的子节点,以查找

  • 嵌套滚动视图在向下滚动时滚动流畅,但在向上滚动时滚动缓慢。向上滚动时折叠工具栏(带有图像视图和框架布局)不会呈现其内容(保持空白)。我已经尝试了折叠工具栏中的每个标志。

  • 问题内容: epoll的手册页上有一个触发边的示例代码,如下所示: 在do_use_fd函数中,我在while循环中调用非阻塞recv直到EAGAIN为止,示例代码运行良好。 我对此示例代码有一个疑问,假设现在我有50个套接字客户端连接,突然有10个客户端同时写入数据,因此epoll_wait()将返回10,然后转到for循环: 它将调用 这10个客户端,假设n = 5完成,并且n = 6尚未完成