Android 如何使按钮更灵敏?
我注意到有些按钮似乎没有它们可能的那么灵敏。这同样适用于我的应用程序和我尝试过的大多数其他应用程序 当我按下按钮时,按钮在按下状态下亮起之前会有一点延迟(编辑:我估计大约20-50毫秒)。一些应用程序已经成功地消除了这种延迟,例如RealCalc(可在市场上买到),它的按钮在你按下后立即切换到按下状态 大多数情况下,这种延迟并不明显,但在我的例子中,按钮用于自定义数字键盘,这种微小的延迟会对用户造成干扰。RealCalc感觉更加灵敏和精巧,因为这种滞后已经消除 我的问题是-如何消除这种滞后?我知道我可以子类化、重写onTouchEvent并从那里继续,但我更喜欢只使用标准控件和选项的解决方案。我怀疑这个解决方案可能会干扰滚动,但我可以接受 编辑:具体地说,提到的延迟是指将手指放在按钮上并按住按钮直到按钮切换到按下状态的时间。再次移除手指时,将调用onClick处理程序Android 如何使按钮更灵敏?,android,user-interface,Android,User Interface,我注意到有些按钮似乎没有它们可能的那么灵敏。这同样适用于我的应用程序和我尝试过的大多数其他应用程序 当我按下按钮时,按钮在按下状态下亮起之前会有一点延迟(编辑:我估计大约20-50毫秒)。一些应用程序已经成功地消除了这种延迟,例如RealCalc(可在市场上买到),它的按钮在你按下后立即切换到按下状态 大多数情况下,这种延迟并不明显,但在我的例子中,按钮用于自定义数字键盘,这种微小的延迟会对用户造成干扰。RealCalc感觉更加灵敏和精巧,因为这种滞后已经消除 我的问题是-如何消除这种滞后?我知
一些答案建议将大部分onClick处理程序移动到线程。这不是问题所在。为了确保这一点,我已经删除了所有的点击处理程序,但仍然存在微小的延迟。因此,在任何Android应用程序中,基本上都是在主线程中运行GUI。如果你碰巧在同一个线程中运行一些其他繁重的东西,比如通信、视频、循环等等,这些活动肯定会减慢你的GUI速度。
我的应用程序在过去也发生过这种情况,然后我将所有其他进程都移动到一个单独的线程中,GUI变得真正实时响应。我深入研究了Android源代码,以了解发生了什么 事实证明,android.view.view类(按钮从中派生)在进入按下状态之前进入“预压缩”状态: android.view.view:
1529 /**
1530 * Indicates a prepressed state;
1531 * the short time between ACTION_DOWN and recognizing
1532 * a 'real' press. Prepressed is used to recognize quick taps
1533 * even when they are shorter than ViewConfiguration.getTapTimeout().
1534 *
1535 * @hide
1536 */
1537 private static final int PREPRESSED = 0x02000000;
在我的NexusOne上,android.view.ViewConfiguration.getTappTimeout()是115毫秒,比我估计的要长得多
android.view.ViewConfiguration:
67 /**
68 * Defines the duration in milliseconds we will wait to see if a touch event
69 * is a tap or a scroll. If the user does not move within this interval, it is
70 * considered to be a tap.
71 */
72 private static final int TAP_TIMEOUT = 115;
无论如何,从查看View.onTouchEvent来看,似乎没有任何标准选项可以避免这种预压缩状态。这真是太可惜了
好消息是,我现在已经验证了避免这种延迟的方法是子类化和重写onTouchEvent
感谢您的讨论和回答。这似乎解决了问题:
public boolean onTouchEvent (MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) setPressed(true);
return super.onTouchEvent(event);
}
仍然不完美,但更好。嗯。。。我通常扩展Button类并重写onTouchEvent方法
public boolean onTouchEvent (MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
setPressed(true);
}
return super.onTouchEvent(event);
}
不,这里的问题不是缺少线程。我用更多的信息编辑了我的问题。我们谈论的是实际的设备还是模拟器?设备(Nexus One和HTC Hero)在哪台设备上你发现了滞后?在Nexus One(CyanogenMod 7 RC1)和HTC Hero(HTC Sense Android 2.1)上,我的N1工作起来很有魅力,我在按下按钮时找不到任何“滞后”。也许你应该少喝点咖啡:)我确实意识到我可能对这些东西过敏:)但我现在已经确定了我所经历的滞后的原因,并在下面添加了我自己的答案。好多了。好办法。默认延迟很烦人。