相同密度的不同 Android 设备上的滑动(滑动)速度不同

2023-12-25

我正在编写自己的图像查看器,使用户能够向左\向右滑动以查看下一个\上一个图像。我想根据投射速度制作图像变化的动画。

为了检测猛击手势及其速度,我遵循了这个基本手势检测 https://stackoverflow.com/questions/937313/android-basic-gesture-detection并按照已接受的答案的建议进行操作:

public class SelectFilterActivity extends Activity implements OnClickListener
{

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* ... */

        // Gesture detection
        gestureDetector = new GestureDetector(this, new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                return gestureDetector.onTouchEvent(event);
            }
        };

    }

    class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
                }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }

    }

问题是我为不同的 Android 设备获得了不同的速度值(velocityX 和velocityY)same密度。基本上这意味着在一台设备中滑动感觉缓慢且不敏感,而其他设备感觉太敏感。

我认为这可能与设备上的“默认”最大速度有关,可以使用 - 获取

ViewConfiguration.get(mContext).getScaledMaximumFlingVelocity()

具有相同密度的不同设备上的结果与预期不同:

    Samsung S I 480x800 density 1.5 Android 2.1
    getScaledMinimumFlingVelocity(): 75
    getScaledMaximumFlingVelocity(): 3600
    ViewConfiguration.MAXIMUM_FLING_VELOCITY = 4000

    HTC Desire 480x800 density 1.5 Android 2.3.3
    getScaledMinimumFlingVelocity(): 75
    getScaledMaximumFlingVelocity(): 6000
    ViewConfiguration.MAXIMUM_FLING_VELOCITY = 4000

    Samsung S III mini 480x800 density 1.5 Android 4.1
    getScaledMinimumFlingVelocity(): 75
    getScaledMaximumFlingVelocity(): 12000
    ViewConfiguration.MAXIMUM_FLING_VELOCITY = 8000

你还可以看到查看配置 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/view/ViewConfiguration.java/有 2 个不同的值MAXIMUM_FLING_VELOCITY在 Android 4.0 以下及以上版本中。

为什么具有相同密度和几乎相同 API 级别的不同设备没有相同的最大速度? 当用户进行滑动手势时,如何在不同设备上获得相同的体验? 我可以使用最大速度数据在所有 Android 设备上提供统一的体验吗?


我有类似的问题。而不是直接使用来自的最大和最小抛掷速度ViewConfiguration,您可以将速度标准化为 0 到 1 之间的值。

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    float maxFlingVelocity    = ViewConfiguration.get(mContext).getScaledMaximumFlingVelocity();
    float velocityPercentX    = velocityX / maxFlingVelocity;          // the percent is a value in the range of (0, 1]
    float normalizedVelocityX = velocityPercentX * PIXELS_PER_SECOND;  // where PIXELS_PER_SECOND is a device-independent measurement

换句话说,velocityPercentX给你以百分比表示的投掷“力量”,并且normalizedVelocityX是应用程序逻辑的速度(例如与设备无关的像素中的图像宽度)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相同密度的不同 Android 设备上的滑动(滑动)速度不同 的相关文章

  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • 如何使用应用程序接口将蓝牙套接字传递给另一个活动

    因此 根据我收集的信息 套接字连接既不可序列化 也不可分割 但我需要将蓝牙连接传递给另一个活动 我不想作为中间人编写服务 所以请不要将此作为解决方案发布 我听说有一种方法可以使用自定义应用程序接口来传递这些类型的对象 但我一生都找不到这样的
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 使用 JAD 反编译 java - 限制

    我正在尝试使用 Java 中的 JAD 反编译几个 jar 文件 我也尝试过 JD GUI 但运气更差 但出现了很多错误 一种类型 易于修复 似乎是内部类 但我也发现了这段代码 static int SWITCH TABLE atp com
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • 为什么这个私人浮动字段变为零?

    我有一些奇怪的行为 我很难向自己解释 称为 textureScale 的浮点字段变为零 如果某些代码正在更改该值 则可以解释这一点 然而 我希望能够通过将其设置为 私有最终浮点 来导致构建失败 或者至少是运行时异常 那么无论更改该值都将失败
  • 对于当前月份和日期但年份不同的日期,经过的月份计算未给出正确的结果

    我正在尝试计算自特定日期以来经过的月份 该函数工作正常 尽管如果我将今天的日期与过去的不同年份放在一起 它会给我一个月的差异 不到一个月 假设对于所有日期 该函数都运行良好 除了 如果今天是 2014 03 06 YYYY MM DD 并且
  • 如何用表达式语言获取布尔属性?

    如果我有一堂这样的课 class Person private int age public int getAge return age public boolean isAdult return age gt 19 我可以得到age像这样
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使
  • 为什么范围为“provided”的依赖项会隐藏 Maven 中的传递依赖项?

    我的 Maven 项目中有三个模块 这稍微简化了 model包含JPA注释的实体类 坚持实例化一个实体管理器并调用它的方法 应用创建类的实例model 设置一些值并将它们传递给坚持 model and 坚持显然取决于javax persis

随机推荐

  • 如何运行所有 rake 任务?

    每当 gem 刚刚安装https github com javan whenever https github com javan whenever运行我的 rake 任务 这些任务是 nokogiri feedzilla 依赖的抓取任务
  • Python 中哪个更高效:标准导入还是上下文导入?

    如果这个问题看起来有补救作用 我提前道歉 在 Python 中这被认为更有效 标准进口 import logging try some code exception Exception e logging error e or 上下文导入
  • 包含助手不起作用

    我试图在我的测试中包含一些助手 但我无法让它发挥作用 我收到以下错误 home edu rvm rubies ruby 1 9 3 p392 bin ruby S rspec spec features customers spec rb
  • 如何使用 pywinauto 右键单击​​文件夹并从上下文菜单中选择?

    我正在为云同步桌面应用程序编写自动化测试 我面临的问题是 我无法从窗口中选择子文件夹 并且右键单击文件夹时无法从上下文菜单中选择选项 Example import pywinauto pywinauto Application Start
  • 自动生成与现有表匹配的用户定义表类型

    我的数据库中已经存在几个表 其中一些有相当多的专栏 我想制作一些存储过程来对这些表执行合并语句 为此 我希望存储过程的参数是用户定义的表类型 我可以编写每个表的脚本并将其修改为用户定义的表类型创建语句 但我真正想要的是一种从数据库中现有表生
  • 如何从存储过程返回bool

    我正在尝试弄清楚如何编写返回布尔值的存储过程 我开始编写以下返回 int 的代码 USE Database GO Object StoredProcedure dbo ReturnInt Script Date 09 30 2010 09
  • IntraWeb 的 SSL 问题 - Delphi 2007

    最近一段时间 我一直在尝试在 IW 程序上使用 SSL 但一直遇到 无法加载 SSL 库 的问题 我已经遵循了我能找到的关于这个主题的每一条建议 但仍然没有快乐 我已经在本地目录和 system32 中尝试了建议的 DLL 有人对我应该使用
  • 将 null 分配给 JSON 字段而不是空字符串

    由于空字符串是 Go 的零 默认值string 我决定将所有此类字段定义为interface 反而 例如 type student struct FirstName interface json first name MiddleName
  • 从 Kotlin 活动中获取额外的字符串

    我想从意图中获得另一个活动中的额外字符串 这是创造我的意图的方式 val intent Intent this Main2Activity class java intent putExtra samplename abd startAct
  • firestore数据存储在子集合中

    我正在 Firestore 中制作一个 聊天演示 来保存消息 我这样做是这样的 FirebaseFirestore getInstance collection Consts R CHAT ROOM document finalChatRo
  • 交换不同长度字符串中特定位置的字符

    我一直在尝试学习 sed 我在这里找到的示例用于交换从 05082012 到 20120805 的日期 但我无法使它们适应我当前的需要 我需要将 IP 地址 10 4 13 22 转换为 nsupdate 脚本的反向查找 22 13 4 1
  • XQuery 存在检查选择 sql 查询

    我有一个带有 xml 列的 sql 表 其中包含如下 xml 的值
  • 如何计算没有循环的矩阵的欧几里德长度?

    看起来这个问题的答案应该很简单 但我很困惑 我有一个 Nx3 矩阵 其中第 1 2 和 3 列是第 n 个项目的 X Y 和 Z 坐标 我想计算从原点到该项目的距离 在非矢量化形式中 这很容易 距离 范数 x y z or 距离 sqrt
  • Laravel NotFoundHttpException

    我对这条路线有疑问 Route get va uniqueid AdminController VaShow gt name va 并在控制器中 public function VaShow uniqueid 123 dd uniqueid
  • 在 Flow 中输入“camel caser”:方差问题?

    尝试流链接 https flowtype org try 0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgBSAygPIByYAvGAHYCuMMYAPmAM4YBOAlrQOas69ALYAjPFyFi4cGHgCGtIQ
  • 如何使用 Python 在文本文件中查找单词

    我是 python 新手 正在尝试在 python 中创建一个函数 该函数查找文本文件中出现该单词的行并打印行号 该函数将文本文件名和单词列表作为输入 我不知道从哪里开始 Example index notes txt isotope pr
  • 版本控制(即 Subversion)适用于文档跟踪吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我负责大约 100 多个文档 word 文档 而不是源代码 需要由我部门的不同人员进行修改 目前 所有文档都位于一个共享文件夹中 它们将在其中检
  • 在django中传递json并反序列化表单

    接下来的问题是 我使用 ajax 向服务器发送一些发布数据 该数据看起来像 data form this serialize some array 2 3 4 1 如何在django中获取表单对象 request POST form 返回带
  • Twitter Bootstrap:全宽 div 的列重新排序

    这看起来是一个简单的任务 但无法让它发挥作用 我需要为平板电脑重新排序 div 宽度为 100 请看一下下面的内容fiddle http jsfiddle net 711p2dLb 看看我的意思 原文参考 div class row div
  • 相同密度的不同 Android 设备上的滑动(滑动)速度不同

    我正在编写自己的图像查看器 使用户能够向左 向右滑动以查看下一个 上一个图像 我想根据投射速度制作图像变化的动画 为了检测猛击手势及其速度 我遵循了这个基本手势检测 https stackoverflow com questions 937