getDrawingCache не обновляется


Я вызываю getDrawingCache в функции onDraw. Проблема в том, что он содержит изменения на холсте только в первый раз, и после этого он не обновляется вообще с новыми изменениями. Вот мой код:

        paintAction.draw(canvas);
        if (paintAction.isPermanentChange())
        {
            Bitmap partialBitmap=getDrawingCache();
            int numColored=0;
            for (int index1=0;index1<partialBitmap.getWidth();index1++)
            {
                for (int index2=0;index2<partialBitmap.getHeight();index2++)
                {
                    if (partialBitmap.getPixel(index1,index2)==0xFF000000) 
                        numColored++;
                }
            }
            Log.i("PaintDroid","Bitmap pixels: " + numColored);
            int areaWidth=partialBitmap.getWidth()-SCROLLBAR_SIZE;
            int areaHeight=partialBitmap.getHeight()-SCROLLBAR_SIZE;
            int[] pixels=new int[areaWidth*areaHeight];
            partialBitmap.getPixels(pixels,0,areaWidth,0,0,areaWidth,
                    areaHeight);    
            numColored=0;
            for (int index=0;index<pixels.length;index++)
                if (pixels[index]==0xFF000000) numColored++;
            Log.i("PaintDroid","Pixels: " + numColored);

(setDrawingCache (true) вызывается при создании представления, потому что если я вызову его из onDraw, getDrawingCache вернет null.)

Как можно видеть, я подсчитываю количество черных пикселей, как путем обхода растрового изображения, так и путем получения значений в массив, и, как я уже сказал, я получаю число, которое я ожидал в первый раз, но после этого, оно должно было увеличиться, но не меняется вообще!

Кто-нибудь знает, что случилось? Спасибо.

2 3

2 ответа:

Я решил ее. Проблема заключалась в том, что я вызвал setDrawingCacheEnabled(true) перед последней операцией рисования на холсте в onDraw. Он должен быть вызван после того, как вы закончили рисовать, иначе вы не получите правильных результатов.

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

Для обновления кэша чертежей он должен быть признан недействительным, а порядок вызова методов должен быть следующим:

public Bitmap renderView(View view) {
    view.setDrawingCacheEnabled(true)
    Bitmap bitmap = view.getDrawingCache();
    view.setDrawingCacheEnabled(false)
    return bitmap;
}