Как перерисовать SurfaceView с помощью метода invalidate()?

У меня есть класс GameBoard, который расширяет SurfaceView. Внутри у меня есть метод OnDraw:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int size  = getWidth()/8;
        canvasSize = size;
        pawnBitmap[0] = bigPawn;
        pawnBitmap[1] = smallPawn;
        float left_distance;
        float top_distance;
        for(int j = 0; j < 10; j++){
            for (int i =0; i < 4; i++){
                left_distance = i*size+(float)50;
                top_distance = j*size+(float)10;
                canvas.drawBitmap(pawnBitmap[0], left_distance, top_distance, paint);
                canvas.drawBitmap(pawnBitmap[1], 6*size+i*30+(float)10, top_distance+30, paint);
            }
        }

    }

pawnBoard, bigPawn и smallPawn общедоступны в этом классе, и они такие:

public BitmapFactory myBitmapFactory = new BitmapFactory();

public  Bitmap[] pawnBitmap = new Bitmap[2];
public Bitmap bigPawn =  Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.game_button_2), 90, 90, false);
public Bitmap smallPawn = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.game_button_2), 30, 30, false);

У меня также есть второй метод, в котором я меняю изображение bigPawn и smallPawn:

public void setBitmaps(Bitmap one, Bitmap two){
        this.paint = new Paint();
        this.bigPawn = one;
        this.smallPawn = two;
        this.tmp=4;
        invalidate();

    }

Но после вызова этого метода внутри другого (внутри другого класса) изображения не меняются. Я проверил с помощью переменной tmp, действительно ли метод setBitmaps() изменяет изображения, и это правильно. Но функция аннулирования не работает. Почему? Вот как я вызываю метод setBitmaps:

public void savePermutation(View view){

        Bitmap tmpBitmap1 = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.blue), 230, 230, false);
        Bitmap tmpBitmap2 = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.blue), 100, 100, false);
        myGameBoard.setBitmaps(tmpBitmap1, tmpBitmap2);


    }

Я искал решение, но ничего из того, что я нашел, не помогло.


person Ziva    schedule 03.02.2013    source источник
comment
Вызывается onDraw? Или он рисует неправильные растровые изображения?   -  person Simon    schedule 04.02.2013
comment
onDraw «вызывается», когда я создаю экземпляр GameBoard, который расширяет SurfaceView (onDraw — это стандартный метод для SurfaceView). И с первого раза все рисуется правильно. Но после вызова invalidate() внутри метода setBitmaps ничего не меняется. У меня нет ни ошибок, ни предупреждений. Приложение работает, но растровые изображения не меняются   -  person Ziva    schedule 04.02.2013
comment
Хорошо, буду точнее. После того, как вы аннулируете(), вызывается ли onDraw()?   -  person Simon    schedule 04.02.2013
comment
Нет, onDraw() не вызывается   -  person Ziva    schedule 04.02.2013


Ответы (1)


Переопределить surfaceCreated(). Затем добавьте эту строку:

setWillNotDraw(false);
person Simon    schedule 03.02.2013
comment
Вы имеете в виду, что я должен добавить эту строку в метод surfaceCreated()? К сожалению, это не помогает - person Ziva; 04.02.2013
comment
Да, я думаю, что поверхности не перерисовываются по умолчанию. - person Simon; 04.02.2013
comment
спасибо за помощь, но не помогло, изображения не изменились - person Ziva; 04.02.2013
comment
Это странно. Вы поставили точку останова в onDraw, и она вызывается только при первом создании представления. Правильный? - person Simon; 04.02.2013
comment
Я не уверен, правильно ли я понимаю ваш вопрос. метод onDraw() такой же, как я написал выше. И когда я впервые создаю экземпляр класса GameBoard, все в порядке - я вижу свои изображения на холсте. Но после вызова метода savePermutation() ничего не меняется, изображения все те же, что и в начале. - person Ziva; 04.02.2013
comment
Поставьте точку останова на первую строку onCreate(), super.oncreate() подойдет. Теперь запустите ваше приложение в режиме отладки. Проверьте, не сработала ли точка останова после invalidate(). Дело в том, чтобы определить, действительно ли onDraw() не вызывается. Я думаю, что да, и проблема в том, что ваши растровые изображения никогда не меняются. - person Simon; 04.02.2013