【问题标题】:How to make Canvas draw area transparent in android?如何在android中使Canvas绘制区域透明?
【发布时间】:2012-01-31 23:31:11
【问题描述】:

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

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

}

如何实现,上面的任何sn-ps都会很有帮助。谢谢

【问题讨论】:

  • 嘿@Karthik,你有什么解决办法吗?过去一周我一直在尝试解决同样的问题。

标签: android image canvas transparent


【解决方案1】:
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)

适合我

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

【讨论】:

    【解决方案2】:

    这使画布变得透明,它对我有用:)

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • UnsupportedOperationException
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果你想要一个透明背景的画布,你必须为

        配置背景图片

        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!

        【讨论】:

        【解决方案6】:

        在您的 onDraw() 方法中添加:

        canvas.drawColor(0x00AAAAAA);
        

        这将使您的canvas 透明,background View 将可见。

        【讨论】:

          【解决方案7】:

          我得到了这个输出

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

          【讨论】:

            【解决方案8】:
            canvas.drawColor(Color.argb(0, 255, 255, 255));
            

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

            canvas.drawColor(Color.TRANSPARENT);
            

            【讨论】:

            • 它是否正确绘制任何其他颜色???您的表面视图的背景颜色是什么?
            • 它可以正确绘制其他颜色但是当我尝试这个时我只得到黑色背景..我怎样才能摆脱这个..
            • 如果没有添加,请先尝试在 XML 中添加表面视图的透明背景。那么它可能会正常工作。
            【解决方案9】:

            好吧,我不确定是否要绘制透明画布,但在您的情况下,您可以进行调整,使用背景图像本身绘制画布。

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

            代码示例:

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

            【讨论】:

              猜你喜欢
              • 2011-11-18
              • 1970-01-01
              • 2014-10-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-03-07
              • 2013-03-13
              • 1970-01-01
              相关资源
              最近更新 更多