3

我正在研究 Android 的学习曲线,目前正在研究用户界面细节。我正在尝试的一项基本操作是用手指在屏幕上移动一些东西。似乎是一件非常基本的事情。

我从一个 RelativeLayout (RL) 开始,然后创建了一个 100x100 具有对比背景颜色的视图(故意简单,低图形开销)并将该视图添加到 RL。使用 View.setX 和 View.setY 我可以很好地移动视图。

接下来,我向视图添加了一个 onTouchListener,并使用生成的 .getRawX 和 .getRawY 值来移动视图。它有效 - 但有一个明确的滞后。我希望 View 会留在我的手指下,但它落后了。这是非常明显的。

编辑:这是我的 onTouch 代码:

    public boolean  onTouch(View v,MotionEvent event) {

        boolean bExitValue = true;
        int     iAction;

        iAction = event.getActionMasked();

        if (MotionEvent.ACTION_MOVE == iAction) {
            v.setX(event.getRawX());
            v.setY(event.getRawY());
        }

        else if (MotionEvent.ACTION_DOWN != iAction) {
            bExitValue = false;
        }

        return(bExitValue);

}

我已经尽可能地收紧了 onTouch 方法以保持它的效率——我只使用原语,没有创建对象等等——但这并没有帮助。我尝试过的其他事情:

  • 将 View 的大小从 100x100 减少到 50x50,从而将必须重绘的像素数量减少 75%。没提升。

  • 覆盖 View.onTouchEvent 而不是注册 onTouchListener。没提升。

  • 将 android:hardwareAccelerated="true" 添加到清单中。没提升。

  • 这似乎违反直觉,但我尝试在 MotionEvent 处理程序中插入一个 Thread.sleep() ,基于我在网上找到的各种建议这样做的评论。没有改善,但随着睡眠值的增加,肯定会出现可预见的减速!

  • 使用 MotionEvent.getx 和 .getY 而不是“原始”版本。得到了看似绝对和相对的交错坐标对,使视图变得跳跃,所以我暂时放弃了它,但会在解决当前问题时进行研究。

我在新的 Google Nexus 7 上运行我的代码,所以我不认为硬件对吞吐量感到饥饿。

用手指在屏幕上移动对象是非常重要的。我必须遗漏一些东西,因为没有人会以我看到的缓慢反应时间发布商业代码。

我已经扫描了这里,谷歌可以找到所有东西,但还没有解决方案。提前感谢您的任何指导!

4

1 回答 1

4

您的代码没有问题,我已经实现了简单的拖动并且与您有相同的症状,这是一个与设备相关的问题,每个设备在调用您的触摸时都有自己的延迟。如果您在设备上启用显示触摸(ICS 及更高版本),您会发现它与实际输入相比有点滞后。而且您不是唯一遇到此问题的人。关于这个有很多讨论。

编辑:如果您真的对此感到困扰,这里有一个建议,这仅在高速输入时才明显,尝试测量输入速度,然后预测下一个点在哪里,但这会带来方向突然变化的问题,这个概念需要很多思考。

希望这对您有所帮助并享受您的工作。

于 2013-05-21T01:30:19.047 回答