#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. Удачи!