如何在Android中使Canvas绘制区域透明?

时间:2012-01-02 17:27:19

标签: android image canvas transparent

我想让Canvas区域透明,因为我想在它后面添加一个Image,以便Canvas动作发生在图像上方。我的画布代码在这里

public class Panel extends SurfaceView implements SurfaceHolder.Callback {

private ViewThread mThread;
private ArrayList<Element> mElements = new ArrayList<Element>();

public Panel(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    getHolder().addCallback(this); 
    mThread = new ViewThread(this); 
} 


public void doDraw(Canvas canvas) {
    canvas.drawColor(Color.TRANSPARENT);
    synchronized (mElements) {
        for (Element element : mElements) {
            element.doDraw(canvas);
        }
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // TODO Auto-generated method stub
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (!mThread.isAlive()) {
        mThread = new ViewThread(this);
        mThread.setRunning(true);
        mThread.start();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (mThread.isAlive()) {
        mThread.setRunning(false);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    synchronized (mElements) {
        mElements.add(new Element(getResources(), (int) event.getX(), (int) event.getY()));
    }
    return super.onTouchEvent(event);
}

}

如何实现它,任何片段都会非常有用。谢谢

9 个答案:

答案 0 :(得分:24)

我得到了

的输出
 public Panel(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.setBackgroundColor(Color.TRANSPARENT);                 
    this.setZOrderOnTop(true); //necessary                
    getHolder().setFormat(PixelFormat.TRANSPARENT); 
    getHolder().addCallback(this); 
    mThread = new ViewThread(this); 

} 

答案 1 :(得分:12)

如果您想要具有透明背景的画布,则必须为

配置背景图像
  

mCanvas = new Canvas(mBackgroundBitmap);

使用Bitmap.Config.ARGB_4444

使用像0x00000000这样的颜色作为透明

    Bitmap mBackgroundImage = Bitmap.createBitmap(Size, Size,
                    Bitmap.Config.ARGB_4444);
    mCanvas = new Canvas(mBackgroundImage);

希望这有帮助!我有一个非常透明的画布:D yay!

答案 2 :(得分:7)

canvas.drawColor(Color.argb(0, 255, 255, 255));

第一个属性是alpha,rest是RGB颜色。

canvas.drawColor(Color.TRANSPARENT);

答案 3 :(得分:4)

onDraw()方法中添加以下内容:

canvas.drawColor(0x00AAAAAA);

这将使您的canvas透明,background View将会显示。

答案 4 :(得分:3)

这使得canvas tramsparent,它对我有用:)

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.OVERLAY);

答案 5 :(得分:1)

您可以创建与画布大小相同的位图。使用Color.TRANSPARENCY擦除位图的所有颜色并将其设置为画布位图:

Bitmap transparentBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
Bitmap.Config.ARGB_8888);
transparentBitmap.eraseColor(Color.TRANSPARENT);
canvas.setBitmap(transparentBitmap);

答案 6 :(得分:1)

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)

与我合作很好

override fun onFinishInflate() {
    super.onFinishInflate()
    setZOrderOnTop(true)
    holder.setFormat(PixelFormat.TRANSLUCENT)
    isFocusable = true
    holder.addCallback(surfaceCallback)
}

答案 7 :(得分:0)

好吧,我不确定是否要绘制透明画布,但在你的情况下你可以做一个调整,用背景图像自己绘制画布。

然后你可以用手指画画/画画。

代码示例:

        BitmapDrawable bd = (BitmapDrawable)<YOUR_ACTIVITY>.this.getResources().getDrawable(R.drawable.<DRAWBLE_ID>);
        Bitmap b = bd.getBitmap();

        mBitmap = Bitmap.createBitmap(b,0,0,100,100); // This line is required only if you wanna some change in the bitmap you created
        mCanvas = new Canvas(mBitmap);

答案 8 :(得分:0)

将画布的视图背景颜色设置为#00000000