растровое изображение не отображается в Android

#android #canvas #bitmap

#Android #холст #растровое изображение

Вопрос:

У меня есть следующий код;

 @Override
public void run()
{
    tickCount = 0L;
    Log.d(TAG, "Starting game loop");
    while (running)
    {

        try
        {
            gameCanvas = surfaceHolder.lockCanvas();
            synchronized (surfaceHolder)
            {
                // Log.d(TAG, tickCount   " ticks so far");
                tickCount  ;
                updateGameState();

                render(gameCanvas);
            }
        } finally
        {
            if (gameCanvas != null)
            {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                    surfaceHolder.unlockCanvasAndPost(gameCanvas);
            }
        }
    }
}
  

Проблема, с которой я сталкиваюсь, заключается в том, что при тестировании приложения растровое изображение не отображается. Я попытался скопировать рисованный файл с помощью setBitmap и использовать его.

например.

 mutableBackground = backgroundImage.copy(Bitmap.Config.ARGB_8888, true);
  

где BackgroundImage — это декодированный ресурс для рисования.

и..

     mutableBackground = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
    gameCanvas = new Canvas();
    gameCanvas.setBitmap(mutableBackground);
    gameCanvas.drawColor(Color.GREEN);
  

и..

 gameCanvas = new Canvas(mutableBackground);
  

Если я рисую линию в методе render, она действительно рисуется .. но на черном фоне. Как ни странно, если я делаю

 int myColor = mutableBackground.getPixel(100, 100);
    int greeness = Color.green(myColor);;
    Log.d(TAG, "Greeness - "   greeness);
  

В журнале показано.. Зеленый цвет — 255

Таким образом, растровое изображение окрашивается в зеленый цвет, но отображается как черное. Это действительно сбивает меня с толку, и я должен разобраться с этим очень скоро.

Спасибо всем, кто может помочь.

Ответ №1:

Это немного выходит за рамки моего обычного понимания, но поскольку никто другой не ответил, я попробую. 🙂

Когда вы рисуете таким образом (т. Е. с помощью SurfaceHolder.lockCanvas), вам нужно работать с полученным холстом…вы не можете просто создать новый холст и отправить его в unlockCanvasAndPost. При обычных обстоятельствах вам также не следует работать с базовым растровым изображением canvas. Почему бы вам в вашей функции рендеринга просто не нарисовать на холсте (сначала цвет фона или даже всего растрового изображения, а затем все остальное, что вам нужно). Например, что-то вроде:

 render(Canvas c) {
    c.drawColor(Color.GREEN);
    c.drawBitmap(sprite, x, y, null);
}
  

Комментарии:

1. Спасибо. Я думал, что делаю это неправильно, отправляя canvas свое собственное растровое изображение. Просто не смог найти способ ссылаться на него впоследствии.

2. @Finn Я рад, что мы решили вашу проблему; спасибо, что нашли время принять мой ответ. 🙂 Анимация Android не является тривиальной … Я счел полезным использовать пример кода в качестве отправной точки, когда это возможно. С моей точки зрения, самое близкое, что я могу придумать к тому, что вы показали, — это пример Lunar Lander в SDK. Удачи!