Android:使用onTouch移动视图有一定的滞后性

时间:2013-05-21 00:52:12

标签: android graphics ontouchlistener lag performance

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

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

接下来,我向View添加了一个onTouchListener,并使用生成的.getRawX和.getRawY值来移动View。它有效 - 但有一定的滞后性。我希望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方法以保持其效率 - 我只使用原语,没有创建对象等等 - 但这没有帮助。我尝试过的其他事情:

  • 将视图的大小从100x100缩小到50x50,从而将必须重绘的像素数减少75%。没有改善。

  • 覆盖View.onTouchEvent,而不是注册onTouchListener。没有改善。

  • 在清单中添加了android:hardwareAccelerated =“true”。没有改善。

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

  • 使用MotionEvent.getx和.getY代替“原始”版本。得到了交错的坐标对,这些坐标看起来是绝对的和相对的,使View看起来很蠢,所以我现在放弃了它,但是会研究当前这个问题是否得到解决。

我在新的Google Nexus 7上运行我的代码,因此我认为硬件不会因吞吐量而匮乏。

用手指在屏幕上移动物体非常重要。我必须遗漏一些东西,因为没有人会在我看到的反应时间很慢的情况下发送商业代码。

我在这里扫描过,谷歌可以找到所有内容,但还没有解决方案。提前感谢任何指导!

1 个答案:

答案 0 :(得分:2)

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

编辑:如果你真的为此烦恼,这里有一个建议,这只在高速输入时才会引人注意,尝试测量输入的速度,然后预测下一点会在哪里,但这会带来突然变化的问题方向,这个概念需要经过深思熟虑。

希望这有助于并享受您的工作。