#android #canvas #bitmap #transparency #paint
#Android #холст #растровое изображение #прозрачность #Краски
Вопрос:
Теперь мне нужно нарисовать новый Canvas
в существующем Canvas
(родительском Canvas
), например, в работах Bitmap
.
Логика такова:
- У каждого
Sprite
могут быть другиеSprite
узлы (LinkedList<Sprite> nodes
); -
Если у вас нет узлов (
nodes = null
), тогда будет нарисован(Bitmap) Sprite.image
непосредственно родительский холст, полученный поupdate
методу, например (в настоящее время работает):public void update(Canvas canvas){ if(this.nodes == null){ canvas.drawBitmap(this.image, ...); } ... }
-
Если у него есть узлы, мне нужно создать новый
Canvas
, нарисовать на нем растровое изображение узлов и нарисовать новыйCanvas
на родительскомCanvas
. Это не работает, но идея такова:public void update(Canvas canvas){ ... else { // this.nodes != null Canvas newCanvas = new Canvas(); for(Sprite node: this.nodes){ node.update(newCanvas); } // Canvas working like Bitmap! (?) canvas.drawCanvas(newCanvas, this.x, this.y, this.paint); } }
Реальный пример использования: ну, у меня есть Sprite
called CarSprite
. У CarSprite
есть частный класс с именем WheelSprite extends Sprite
. CarSprite
Реализует два узла (двумерный пример) WheelSprite
, которые будут расположены в CarSprite
так, чтобы они казались частью автомобиля. Пока никаких проблем.
Но если CarSprite
на дьявола повлияет один объект на уровне, он станет прозрачным. Я сделаю, например, objectOfCarSprite.paint.setAlpha(127);
. Проблема в том, что если я это сделаю (в текущем рабочем режиме), прозрачным станет только растровое изображение автомобиля, но не колодец, потому что оно рисуется непосредственно на глобальном Canvas
объекте.
Эта часть не сильно влияет: в настоящее время я получаю родительский (parentN …) Paint
объект alpha, и с помощью некоторой математики я получаю прозрачное решение для wheel, которое работает почти так же хорошо, как мне нужно, но если, например, WheelSprite
объект находится над растровым изображением автомобиля, можно увидеть землю автомобиля, как на картинке.
Существует ли лучший способ сделать то, что я хочу, или только понравившуюся работу в данный момент?
Комментарии:
1. Сначала нарисуйте белую 100% непрозрачную «маску»?
2. Как, по-вашему, я могу это сделать? Я не понимаю ваших советов.
Ответ №1:
Я делаю это. Но работает очень медленно, но работает нормально.
final Bitmap split = Bitmap.createBitmap(GameActivity.screenWidth,
GameActivity.screenHeight,
Bitmap.Config.ARGB_8888);
final Canvas subCanvas = new Canvas(split);
for(final Sprite sprite: this.nodes) {
sprite.update(subCanvas);
}
canvas.drawBitmap(split, this.x, this.y, this.paint);
- Сначала нам нужно иметь
Canvas
объект (здесь простоcanvas
); - После нам нужно создать
Bitmap
место, где мы будем рисовать. Для этого нужно получитьwidth
иheight
из текущегоcanvas
. В этом случае я использовал ярлык; - Далее нам нужно создать новый
Canvas
, он будет передан вSprite.nodes
; - В конце концов, нам нужно нарисовать растровое изображение на глобальном холсте;
Примечание: это работает очень хорошо, но сильно влияет на скорость.