Как сделать холст рисовать область прозрачным в Android? - PullRequest
8 голосов
/ 02 января 2012

Я хотел бы сделать область холста прозрачной, потому что я хотел бы добавить изображение позади него, чтобы над изображением происходили действия холста. Мой код для холста находится здесь

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 ]

24 голосов
/ 03 января 2012

Я получил вывод по этому

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

} 
12 голосов
/ 12 марта 2013

Если вы хотите иметь холст с прозрачным фоном, вы должны настроить фоновое изображение для

mCanvas = new Canvas (mBackgroundBitmap);

сBitmap.Config.ARGB_4444

И используйте цвета, такие как 0x00000000, как прозрачные

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

надеюсь, это поможет!У меня довольно прозрачный холст: D ууу!

8 голосов
/ 02 января 2012
canvas.drawColor(Color.argb(0, 255, 255, 255));

первый атрибут - альфа, а остальные - цвета RGB.

или

canvas.drawColor(Color.TRANSPARENT);
4 голосов
/ 06 февраля 2013

В вашем методе onDraw() добавьте это:

canvas.drawColor(0x00AAAAAA);

Это сделает ваш canvas прозрачным и background View будет видимым.

3 голосов
/ 24 октября 2016

это делает tramsparent холстом, и это работа для меня:)

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.OVERLAY);
1 голос
/ 01 сентября 2018
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)

отлично работает у меня с

override fun onFinishInflate() {
    super.onFinishInflate()
    setZOrderOnTop(true)
    holder.setFormat(PixelFormat.TRANSLUCENT)
    isFocusable = true
    holder.addCallback(surfaceCallback)
}
1 голос
/ 30 сентября 2014

Вы можете создать растровое изображение того же размера, что и холст. Удалите все цвета растрового изображения с помощью Color.TRANSPARENCY и установите его в качестве растрового изображения холста:

Bitmap transparentBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
Bitmap.Config.ARGB_8888);
transparentBitmap.eraseColor(Color.TRANSPARENT);
canvas.setBitmap(transparentBitmap);
0 голосов
/ 26 сентября 2014

Установить цвет фона вида холста на # 00000000

0 голосов
/ 02 января 2012

ну, я не уверен насчет рисования прозрачного холста, но в вашем случае вы можете сделать твик, который рисует холст, используя фоновое изображение.

А потом вы можете рисовать / рисовать пальцемна нем.

Пример кода:

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