我正在研究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上运行我的代码,因此我认为硬件不会因吞吐量而匮乏。
用手指在屏幕上移动物体非常重要。我必须遗漏一些东西,因为没有人会在我看到的反应时间很慢的情况下发送商业代码。
我在这里扫描过,谷歌可以找到所有内容,但还没有解决方案。提前感谢任何指导!
答案 0 :(得分:2)
你的代码没有问题,我已经实现了简单的拖动并且具有与你相同的症状,这是与设备相关的问题,每个设备在调用你的触摸时都有自己的延迟。如果您在设备上启用show touch(ICS及更高版本),您会发现它与实际输入相比略有滞后。而且你并不是唯一遇到这个问题的人。关于这一点有很多讨论。
编辑:如果你真的为此烦恼,这里有一个建议,这只在高速输入时才会引人注意,尝试测量输入的速度,然后预测下一点会在哪里,但这会带来突然变化的问题方向,这个概念需要经过深思熟虑。希望这有助于并享受您的工作。