Android:提高手机屏幕的响应能力?

时间:2012-01-05 21:16:14

标签: android touch screen multi-touch

有没有办法提高设备对特定应用的响应能力?具体来说,现在我的触摸事件肯定会触发,但它们会延迟一秒钟。由于我的应用程序是音乐/节奏应用程序,任何延迟都非常糟糕。我只是想知道,如果我能在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);
}

2 个答案:

答案 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事件的速度越快,您在队列中等待触摸事件的速度就越快。