RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 968567
Accepted
meow meow
meow meow
Asked:2020-04-12 02:50:21 +0000 UTC2020-04-12 02:50:21 +0000 UTC 2020-04-12 02:50:21 +0000 UTC

手势检测器滚动

  • 772

我需要在手机上很好地滚动我的应用程序,但我似乎无法获得所需的响应能力。我想要实现的一个例子是 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();
        }
    }
}
java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Спицко Дмитрий
    2020-04-24T20:36:19Z2020-04-24T20:36:19Z

    这个问题并不完全清楚。对什么特别感兴趣?我不能推荐具体的公式,但我建议你使用 SimpleGestureListener

    private static class MoveListener extends GestureDetector.SimpleOnGestureListener {
    
            @Override
            public boolean onDown (MotionEvent motionEvent) {
                return true;
            }
    
            @Override
            public boolean onScroll (MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                  //двигаемся на вектор (v;v1)(если прокрутка только вертикальная, на (0;v1)). Без анимации
                  return true
            }
    
            @Override
            public boolean onFling (MotionEvent p1, MotionEvent p2, final float v, final float v1) {
                //реагируем на "бросок". Нужно запустить анимацию, которая будет скролить с вектором скорости (v,v1), которая будет плавно уменьшаться
                return true;
            }
        }
    

    创建 View 时,我们会创建一个处理事件的 GestureDetector

    private GestureDetector move_gesture = new GestureDetector (getContext (), new MoveListener ());
    

    在 onTochEvent 中,我们使用 GestureDetector 处理事件

    @Override
    public boolean onTouchEvent (MotionEvent event) {
        return move_listener != null && move_gesture.onTouchEvent (event);
    }
    

    在 onScroll 中我们只是简单的移动视图,这个方法每秒调用 30-60 次(每帧),动画是没有意义的。

    例如,在 onFling 中,我们创建了一个 ValueAnimator,它将值从 1f 更改为 0f,并通过在 onFling 中获得的速度向量乘以 animator 的值来滚动视图。通过更改动画插值器,您将改变投掷的惯性。限制最大初始速度向量也是值得的,因为 它可以通过一点灵巧达到巨大的价值。但这已经通过实验确立

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5