如何在android中使画布绘图区域透明?

如何在android中使画布绘图区域透明?,android,image,canvas,transparent,Android,Image,Canvas,Transparent,我想使画布区域透明,因为我想在其后面添加一个图像,以便画布操作发生在图像上方 public class Panel extends SurfaceView implements SurfaceHolder.Callback { private ViewThread mThread; private ArrayList<Element> mElements = new ArrayList<Element>(); public Panel(Context context,

我想使画布区域透明,因为我想在其后面添加一个图像,以便画布操作发生在图像上方

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);
}
public类面板扩展SurfaceView实现SurfaceHolder.Callback{
私有视图线程mThread;
private ArrayList melents=new ArrayList();
公共面板(上下文上下文,属性集属性){
超级(上下文,attrs);
getHolder().addCallback(此);
mThread=新视图线程(此);
} 
公共虚空doDraw(画布){
画布。drawColor(颜色。透明);
同步(混合){
用于(元素:MELENTS){
元素。doDraw(画布);
}
}
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
//TODO自动生成的方法存根
}
@凌驾
已创建的公共空白表面(表面持有人){
如果(!mThread.isAlive()){
mThread=新视图线程(此);
mThread.setRunning(true);
mThread.start();
}
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
if(mThread.isAlive()){
mThread.setRunning(false);
}
}
@凌驾
公共布尔onTouchEvent(运动事件){
同步(混合){
添加(新元素(getResources(),(int)event.getX(),(int)event.getY());
}
返回super.onTouchEvent(事件);
}
}


如何实现它,上面的任何片段都会非常有用。谢谢,我不确定是否要绘制透明画布,但在你的情况下,你可以做一个调整,使用背景图像绘制画布

然后你可以用手指在上面画画

代码示例:

        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);
BitmapDrawable bd=(BitmapDrawable).this.getResources().getDrawable(R.drawable.);
位图b=bd.getBitmap();
mBitmap=Bitmap.createBitmap(b,0,0100100);//仅当您希望对所创建的位图进行某些更改时,才需要此行
mCanvas=新画布(mBitmap);
第一个属性是alpha,其余属性是RGB颜色


我通过这个得到了输出

 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); 

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

canvas.drawColor(0x00AAAAAA);

这将使您的
画布
透明,并且
背景视图
可见。

如果您希望画布具有透明背景,则必须为

mCanvas=新画布(mBackgroundBitmap)

使用Bitmap.Config.ARGB_4444

并使用0x00000000等颜色作为透明

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

希望这有帮助!我有一块非常透明的画布:耶

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

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

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

这让画布变得更简洁,对我来说很有用:)

这对我来说很好

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

它能正确绘制其他颜色吗???曲面视图的背景颜色是什么?它正确地绘制了其他颜色,但当我尝试此操作时,我只得到黑色背景..如何消除此问题..如果尚未添加,请尝试先在XML中添加曲面视图的透明背景。当我这样做时,我的布局的渲染视图开始隐藏整个布局中的所有元素。我该怎么办?提前感谢。这里有一个小的更新:最好使用ARGB_8888,因为ARGB_4444现在已经被弃用了。来源:嘿@Karthik,你有什么解决办法吗?过去一周我一直在努力解决这个问题。
Bitmap transparentBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
Bitmap.Config.ARGB_8888);
transparentBitmap.eraseColor(Color.TRANSPARENT);
canvas.setBitmap(transparentBitmap);
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.OVERLAY);
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
override fun onFinishInflate() {
    super.onFinishInflate()
    setZOrderOnTop(true)
    holder.setFormat(PixelFormat.TRANSLUCENT)
    isFocusable = true
    holder.addCallback(surfaceCallback)
}