Роль пассивного растрового изображения в Android onDraw () - PullRequest
0 голосов
/ 02 апреля 2020

Некоторое время назад, около API 17 или 21, я добавил растровое изображение ('emptyBmap') в мой метод Android onDraw () в надежде использовать его в приложении, но никогда не делал этого, поэтому приложение только dr aws через Canvas like - canvas.drawline (), et c. Затем я прочитал, что растровые изображения истощают память кучи, и решил (на API 29) удалить строку выделения из кода в приведенном ниже стеке вызовов onDraw:

Bitmap emptyBmap = null;
protected void onDraw(Canvas canvas) {
int horz, vert;
vert = VERT;
horz = HORZ;
...
if(emptyBmap==null||
        (topHalfScreen&&!screenResized)||
        (!topHalfScreen&&screenResized)) setImageView( horz, vert);

setView(horz, vert);

setDrawingArea(horz, vert);

...
}

public void setImageView( int horz, int vert) {
    frameSize[HORZ] =  getWidth()*picFrameSizeMargined;
    if(topHalfScreen&&!screenResized){
        frameSize[VERT] =  getHeight()*halfHeight;
        screenResized = !screenResized;
        resizeScreen();
    }
    else {
        frameSize[VERT] =  getHeight();
        screenResized = false;
        resetScreen();
    }
    emptyBmap = Bitmap.createBitmap( (int)frameSize[HORZ]*2,
            (int)frameSize[VERT]*2, Bitmap.Config.ARGB_8888 );  // <<= The Allocation in Question
    paint = new Paint();
    paint.setColor(FOREGROUND);
    setView( horz, vert);

}

void setView(int horz, int vert){
    orientedFrameSize[LANDSCAPE][vert] = orientedFrameSize[PORTRAIT][horz] = frameSize[HORZ];
    orientedFrameSize[LANDSCAPE][horz] = orientedFrameSize[PORTRAIT][vert] = frameSize[VERT];

    picturePosition[horz] = frameSize[horz]*picNearMarginFraction; // Left of frame
    picturePosition[vert] = frameSize[vert]*sixteenthMargin; // Top of frame
    if(picturePosition[vert]<fontSize) picturePosition[vert] = fontSize;

    orientedPicturePosition[PORTRAIT][horz] = picturePosition[horz];
    orientedPicturePosition[PORTRAIT][vert] = picturePosition[vert];

    orientedPicturePosition[LANDSCAPE][horz] = picturePosition[horz];
    orientedPicturePosition[LANDSCAPE][vert] = picturePosition[vert];

}

Небольшое объяснение оправдано: Вокруг однократное (emptyBmap == нулевое условие) распределение растрового изображения Я закончил, вызывая метод setImageView () (|| это || эти условия), чтобы ограничить график до верхней половины экрана, чтобы растровое изображение было вызвано, даже если оно не было значение NULL. Теперь проблема заключается в том, что если я удаляю выделение, то получаю два наложенных графика в resizeScreen (), один на верхней половине экрана, как и предполагалось, но другой не изменяется, все еще на полном экране и активно перерисовывается, как будто есть растровое изображение где-то освежает. Является ли это, на первый взгляд, пассивное растровое изображение дублирующим то, что я делаю на Canvas?

Нет явных вызовов Bitmap.drawline () или любого другого.

Это единственный пример.

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

Может кто-нибудь объяснить это, потому что, похоже, мне нужно сохранить это, казалось бы, пассивное распределение битовых карт?

...