如何在另一个Canvas上绘制现有的Canvas?

时间:2011-05-22 06:24:23

标签: android canvas bitmap transparency paint

现在我需要在现有的CanvasCanvas )中绘制新的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名为CarSpriteCarSprite有一个名为WheelSprite extends Sprite的私有类。 CarSprite实现了WheelSprite的两个节点(二维示例),这些节点将位于CarSprite中,似乎是汽车的轮廓。到目前为止,没问题。

但如果CarSprite受到关卡中某个对象的影响,则会转为透明。例如,我会做objectOfCarSprite.paint.setAlpha(127);。问题是,如果我这样做(当前正在工作模式),只有汽车位图会变得透明,而不是井,因为它是直接绘制到全局{{ 1}}对象。

此部分影响不大:目前,我正在获取父(父N)Canvas对象alpha,并且通过一些数学计算,我得到了一个透明的解决方案对于我需要的几乎同样有效的滚轮,但是,例如,如果Paint对象超过汽车位图,则可以看到汽车的地面,如图片。

存在一种更好的方式来执行,就像我想要的,或者只有就像当前的工作一样

Example

1 个答案:

答案 0 :(得分:2)

我做到了。但是很慢,但工作正常。

    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获得heightcanvas。我在这个案例中使用了一个快捷方式;
  3. 接下来,我们需要制作一个新的Canvas,它会传递给Sprite.nodes;
  4. 毕竟,我们需要在全局画布上绘制位图;
  5. 注意:这种效果非常好,但影响速度很快。