我的位图变黑 canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY) Android

My bitmap turns black with canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY) Android

我有一个 Activity 可以使用 Picasso Library 从 URL 加载图像。

这张图片比屏幕大,这就是为什么在方法"onTouch"中实现了一个模拟地图滚动图片的代码。

我的问题是我在那个图像上画了圆圈,每次我点击屏幕我都应该画一个圆圈并擦掉之前的圆圈。

使用这一行 canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY);将我的整个位图变黑。

当我点击屏幕并删除上一个时,我需要在图像上画一个圆圈

这是我的 Activity

的代码片段

将图像加载到 imageView 并创建位图以在复制位图上绘制 canvas

Picasso.with(getApplicationContext()).load(url).into(imageView, new Callback() {
  @Override
  public void onSuccess() {
  imageView.setVisibility(View.VISIBLE); 
  lineABmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
  lineAMutBmp = lineABmp.copy(Bitmap.Config.RGB_565, true);
  copy = Bitmap.createBitmap(lineAMutBmp);
  canvas = new Canvas(copy);
  imageView.setImageBitmap(copy);
}
});

画圈

    private void drawBeacon() {

    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY);
    canvas.drawCircle(startX, startY, circle_radius, circle);

    canvas.drawRect(startX - 50,//left
            startY - 30, // top
            startX + 50, //right
            startY - 10, rect); //bottom

    canvas.drawText(" Minor: " + beacon.getMinor(),
            startX - 45,
            startY - 15, text);

    imageView.invalidate();


}

初始化画图

    init(){
    circle = new Paint();
    circle.setColor(Color.rgb(46, 204, 113));
    circle.setStyle(Paint.Style.FILL);
    circle.setStrokeWidth(10);

    circle_radius = 10;

    text = new Paint();
    text.setColor(Color.BLACK);
    text.setTextSize(16);
    text.setFakeBoldText(true);

    rect = new Paint();
    rect.setColor(ContextCompat.getColor(getApplicationContext(), R.color.white_80));
    rect.setStyle(Paint.Style.FILL_AND_STROKE);   }

OnTouch,在这个方法中我缩放和拖动图像并调用方法来绘制圆圈

public boolean onTouch(View v, MotionEvent event) {
    ImageView view = (ImageView) v;
    view.setScaleType(ImageView.ScaleType.MATRIX);
    float[] m = new float[9];
    matrix.getValues(m);
    float transX = m[Matrix.MTRANS_X] * -1;
    float transY = m[Matrix.MTRANS_Y] * -1;

    // Handle touch events here...
    switch (event.getAction() & MotionEvent.ACTION_MASK) {

        case MotionEvent.ACTION_DOWN: //first finger down only
            savedMatrix.set(matrix);

            if (draw) {
                startX = Math.abs((event.getX() + transX) / scale);
                startY = Math.abs((event.getY() + transY) / scale);
                drawBeacon();
            } else {
                ...
            }

            break;
        case MotionEvent.ACTION_UP: //first finger lifted
        case MotionEvent.ACTION_POINTER_UP: //second finger lifted
            ...
             break;
        case MotionEvent.ACTION_POINTER_DOWN: //second finger down
            ....
            break;
        case MotionEvent.ACTION_MOVE:
            ....
                break;
            }
    } //perform the transformation.

    view.setImageMatrix(matrix);
    return true; // indicate event was handled

}

终于自己动手了。我在我的方法中创建了位图的副本

 private void drawBeacon() {
    Bitmap tmpBitmap = Bitmap.createBitmap(copyOriginal);
    Canvas canvas = new Canvas(tmpBitmap);

    ....

    bitmapLayers.add(1, tmpBitmap);
    bt_delete.setVisibility(View.VISIBLE);
    imageView.setImageBitmap(tmpBitmap);
    draw = false;

}