我正在研究 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 上运行我的代码,所以我不认为硬件对吞吐量感到饥饿。
用手指在屏幕上移动对象是非常重要的。我必须遗漏一些东西,因为没有人会以我看到的缓慢反应时间发布商业代码。
我已经扫描了这里,谷歌可以找到所有东西,但还没有解决方案。提前感谢您的任何指导!