有没有办法提高设备对特定应用的响应能力?具体来说,现在我的触摸事件肯定会触发,但它们会延迟一秒钟。由于我的应用程序是音乐/节奏应用程序,任何延迟都非常糟糕。我只是想知道,如果我能在Manifest中做任何可以提高响应能力的事情。或者也许一些使代码工作更快的建议?我必须在应用程序中创建多个线程来处理多点触控,也许有一种有效的方法可以做到这一点?
最佳, Aneem
编辑:
public boolean onTouchEvent(final MotionEvent ev) {
if(ev.getAction()==ev.ACTION_DOWN||ev.getActionMasked()==ev.ACTION_POINTER_DOWN){
AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
PointF[] touchPoints = new PointF[ev.getPointerCount()];
for(int i = 0; i < ev.getPointerCount(); i++){
touchPoints[i] = new PointF(ev.getX(i),ev.getY(i));
}
for(final PointF point : touchPoints){
x = ev.getX(ev.getActionIndex());
y = ev.getY(ev.getActionIndex());
int ptx = (int) (x - x%widthIncrement);
int pty = (int) (y - y%heightIncrement);
playSound(pointMap.get(new Point(ptx,pty)));
}
return true;
}
return true;
}
public void playSound(int sound){
AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
database.play(sound, streamVolume, streamVolume, 1, 0, 1);
}
答案 0 :(得分:2)
如果您的用户界面缓慢,那么您在响应UI事件时会做太多工作。如果您必须做任何非平凡的事情(加载声音文件等)以响应UI事件,那么您应该将该工作打包成AsyncTask或其他类型的工作线程。然后,UI响应方法应该启动线程来完成繁重的工作,更新UI并返回。
文章Painless Threading详细介绍了如何完成所有这些工作。
答案 1 :(得分:0)
您应该在UI线程上处理接收它们的触摸事件。您不需要使用多个线程来处理多个触摸点。有关所有活动触摸点的数据将包含在您收到的单个MotionEvent对象中。
如果您遇到一些时间问题,您可能会发现MotionEvent提供的事件时间值很有用。您可以获取事件发生的时间,包括MotionEvent表示的最近事件以及已经批量处理的任何历史事件。您可以将事件时间与处理事件时的当前时间进行比较,从而可以检查“及时”以正确确定事件是否发生在您正在寻找的节奏上。 (此处使用的比例中的当前时间可以从SystemClock.uptimeMillis()获得。)
相关方法: MotionEvent#getEventTime() MotionEvent#getHistoricalEventTime(int)
正如Ted Hopp所说,你还应该尝试将任何重量级处理移出你的UI线程。响应UI事件的速度越快,您在队列中等待触摸事件的速度就越快。