Как я могу нарисовать существующий холст на другом холсте?

#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);
  
  1. Сначала нам нужно иметь Canvas объект (здесь просто canvas );
  2. После нам нужно создать Bitmap место, где мы будем рисовать. Для этого нужно получить width и height из текущего canvas . В этом случае я использовал ярлык;
  3. Далее нам нужно создать новый Canvas , он будет передан в Sprite.nodes ;
  4. В конце концов, нам нужно нарисовать растровое изображение на глобальном холсте;

Примечание: это работает очень хорошо, но сильно влияет на скорость.