Android: повысить отзывчивость экрана телефона? - PullRequest
1 голос
/ 06 января 2012

Есть ли способ повысить отзывчивость устройства для конкретного приложения?В частности, сейчас мои сенсорные события определенно срабатывают, но они задерживаются на долю секунды.Поскольку мое приложение является приложением музыки / ритма, любая задержка очень плохая.Мне было просто интересно, если бы в Манифесте было что-нибудь, что могло бы повысить отзывчивость.Или, возможно, некоторые предложения по ускорению работы кода?Я должен создать несколько потоков в приложении, чтобы обрабатывать мультитач, возможно, есть эффективный способ сделать это?

Best, Aneem

EDIT:

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 ]

2 голосов
/ 06 января 2012

Если ваш пользовательский интерфейс медленный, вы выполняете слишком много работы в ответ на события пользовательского интерфейса.Если вам нужно сделать что-нибудь нетривиальное (загрузить звуковой файл и т. Д.) В ответ на событие пользовательского интерфейса, вам следует упаковать этот пакет в AsyncTask или другой вид рабочего потока.Затем метод ответа пользовательского интерфейса должен просто запустить поток, чтобы выполнить тяжелую работу, обновить пользовательский интерфейс и вернуться.

В статье Потоки без боли есть больше подробностей о том, как все это сделать.

0 голосов
/ 06 января 2012

Вы должны обрабатывать сенсорные события в вашем потоке пользовательского интерфейса, где они получены. Вам не нужно использовать несколько потоков для обработки нескольких точек касания. Данные обо всех активных точках касания будут содержаться в одном полученном вами объекте MotionEvent.

Если у вас возникли проблемы с синхронизацией, вам могут пригодиться значения времени события, предоставленные MotionEvent. Вы можете получить время, когда событие произошло, как для самого последнего события, выраженного MotionEvent, так и для любых исторических событий, которые были включены в него. Вы можете сравнить время события с текущим временем, когда вы обрабатываете событие, что позволяет вам проверить «назад во времени», чтобы правильно определить, произошло ли событие в том ритме, который вы ищете. (Текущее время в используемой здесь шкале можно получить из SystemClock.uptimeMillis () .)

Соответствующие методы: MotionEvent # getEventTime () MotionEvent # getHistoricalEventTime (INT)

Как отмечает Тед Хопп, вы должны также попытаться переместить любую тяжеловесную обработку из вашего потока пользовательского интерфейса. Чем быстрее вы реагируете на события пользовательского интерфейса, тем быстрее вы получаете ожидающие сенсорные события в очереди.

...