Я могу иметь несколько методов рисования? - PullRequest
2 голосов
/ 25 июля 2011

Я создал свой собственный класс canvas, который расширяет imageView.Мой метод onDraw () вытягивает позицию gps пользователя, и я продолжаю вызывать этот метод onDraw каждый раз, когда пользователь перемещается.Моя проблема в том, что я также хочу нарисовать GPS-трейл, который нужно нарисовать только один раз (не нужно обновлять, когда пользователь перемещается).Мне интересно, возможно ли иметь более одного метода onDraw или есть какой-либо способ разделения 1) пользовательского местоположения и 2) следа GPS ??

Моя причина в том, что я не хочу тратить память наперерисовывать маршрут gps каждый раз, когда пользователь меняет положение gps.Это пустая трата.

Ответы [ 3 ]

1 голос
/ 25 июля 2011

Недавно мне пришлось решить несколько похожую проблему, и я кратко объясню, что я сделал в случае, если это поможет.

Что вы можете сделать, это использовать несколько перекрывающихся видов, в которых может содержаться фоновая графика, которую вы не хотите часто перерисовывать, и вид на переднем плане, который содержит графику, которая часто обновляется. Затем, чтобы повысить производительность, вы можете сконструировать фоновое представление onDraw() так, чтобы оно поддерживалось растровым изображением, которое затем сохранялось как переменная класса. В самой первой onDraw() вашей фоновой графики вы делаете относительно медленное рисование в Canvas. При последующих вызовах onDraw() вы просто рисуете этот растр в Canvas.

Я только что сделал это сам. По сути, мое приложение отображает несколько графических индикаторов. Эти датчики имеют много графики, которые рисуются только один раз (грань датчика, числовые условные обозначения), и графику указателя, которую необходимо перерисовывать снова и снова при изменении данных модели. Прежде всего, я разбил фоновую графику и переместил графику переднего плана в отдельные перекрывающиеся виды. Теперь, аннулирование и перерисовка графического указателя на переднем плане, конечно же, приводит к тому, что все перекрывающиеся объекты также становятся недействительными, поэтому метод onDraw() для фонового графического представления вызывается каждый раз, когда перерисовывается указатель. Фоновому представлению требуется только один раз нарисовать фоновую графику, но он сохраняет растровое изображение, поддерживающее холст, и при последующих вызовах onDraw() возвращает это растровое изображение обратно в Canvas (что намного быстрее, чем первоначальное создание графики с использованием Path (). объекты).

Bitmap bm;


....

protected void onDraw(Canvas canvas){
    if(null==bm){
        bm=Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(),Bitmap.Config.ARGB_8888);
        // do your slow vector graphics drawing to Canvas here
    }
    Paint drawPaint = new Paint();
    drawPaint.setAntiAlias(false);
    drawPaint.setFilterBitmap(false);
    drawPaint.setDither(false);
    canvas.drawBitmap(bm, 0, 0, drawPaint);
}
1 голос
/ 25 июля 2011

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

Если ваше приложение немного запаздывает, и вы обнаружили, что этот путь является узким местом ... Я бы предложил его кэшировать.в растровое изображение.Таким образом, вам все равно придется рисовать след, но вам не нужно будет вычислять координаты следа в каждом кадре.

0 голосов
/ 25 июля 2011

Ну, не может быть более 1 метода onDraw, если я правильно понял ваш вопрос.Вам нужно будет подумать об альтернативных подходах к тому, как справиться с этим.

@ DeeV предложил, что может быть решением для вас.

...