所以,基本上,我有一个ScrollView,其中添加了许多各种ViewGroups和Views,我的Activity应该响应那些Views的点击。不幸的是,我设置的OnClickListeners减慢了ScrollViews的反应时间,从而加快了滚动或拖动手势的速度(当他们在有问题的视图上启动时)。
有没有办法正确执行此操作或解决此问题?
答案 0 :(得分:3)
是的,我不确定降低布局的复杂性会对你有所帮助。您的设备/模拟器正在运行哪个API版本?因为我已经注意到在可点击视图上开始滚动事件时从2.1到2.2的变化,正如您所描述的那样。
就我而言,我使用requestDisallowInterceptTouchEvent()
方法启用嵌套滚动。通常,这将允许我将ScrollView或ListView 放在另一个ScrollView中,并且仍然可以正确滚动。但是,从API级别8开始,如果触摸事件在“可点击”控件上启动,则此“嵌套滚动”不再有效! Augh!我没有看过源来确定它究竟发生的原因,但听起来它与你的问题有关。
因此,似乎最近有一个关于可点击控件如何消耗触摸事件的变化,这在某些情况下对他们的父母产生了不利影响。我怀疑是否有解决方案。
修改强>
如果您想以另一种方式实施“点击”,那肯定是可能的。我通常不推荐它,但后来我不知道你的滚动性能有多糟糕。由你决定。
如果你想这样做,可以在你的ScrollView中添加一个OnTouchListener,但我认为这样做会更难。您必须侦听ACTION_UP
个事件,但只有当相应的ACTION_DOWN
事件在y方向上远离touchSlop
时才会使用事件(touchSlop
是在ListView
开始滚动之前,触摸必须经过的最小距离...它从ViewConfiguration
获得此值。然后,当您使用该事件时,您必须将ListView.getScrollX()
和ListView.getScrollY()
添加到事件的坐标,以便将其与可点击控件的位置进行比较。如果你想要“长时间点击”,你将不得不做更多的工作来实现这些。所有这些仅适用于触摸事件......您还需要添加一个关键监听器,以便用户可以使用轨迹球单击它。
我认为您可以将OnTouchListener添加到每个控件,而不是OnClickListener。检查查看源代码以查看如何注册点击。如果您不需要注册“长按”,那么对您来说会更容易。然后,您将能够将任何ACTION_UP
事件视为一次点击。你还需要一个关键的监听器来处理轨迹球点击。
对于轻微的滚动打嗝来说,似乎有很多工作要做。我想知道我是否正确理解这个问题,是否真的比我认为的更严重?
答案 1 :(得分:2)
我不知道Android平台的细节,但典型的建议是在事件处理程序中尽可能少地做。快速检查它是否是您感兴趣的事件并将任务放入队列中。使用另一个线程从队列中提取任务,聚合并执行它们。
答案 2 :(得分:0)
尝试并减少ViewGroups和Views的数量,可能是通过对scrollview中的每个项目使用RelativeLayout。使用HierarchyViewer工具检查视图的深度,并尝试使用Romain Guy关于布局改进的提示:
http://www.curious-creature.org/2009/03/01/android-layout-tricks-3-optimize-part-1/
答案 3 :(得分:0)
为什么你认为OnClickListeners让它变慢?
将所有点击侦听器设置为null并尝试使用该应用程序。现在快点吗?
否则,请对您的应用进行分析,以了解哪些内容很慢。
http://www.jpct.net/wiki/index.php/Profiling_Android_Applications