【问题标题】:Setting the opacity of drawing canvas in android在android中设置绘图画布的不透明度
【发布时间】:2015-02-02 18:58:03
【问题描述】:

我正在开发一个在画布上绘制一些透明线的功能,问题是,如截图所示,线上有一些“球形”。

这是我的代码:

canvas = new Canvas(alteredBitmap);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(width);
        paint.setColor(color);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setAlpha(alpha);
        matrix_draw = new Matrix();
        canvas.drawBitmap(bmp, matrix_draw, paint);
        setImageBitmap(alteredBitmap);

按下按钮设置 alpha

   public void setAlpha(int alpha) {
        this.alpha = alpha;
        paint.setAlpha(alpha);
    }

还有听者

    drawListener = new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();

                switch (action) {
                case MotionEvent.ACTION_DOWN:
                    downx = getPointerCoords(event)[0];// event.getX();
                    downy = getPointerCoords(event)[1];// event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    upx = getPointerCoords(event)[0];// event.getX();
                    upy = getPointerCoords(event)[1];// event.getY();
                    canvas.drawLine(downx, downy, upx, upy, paint);
                    invalidate();
                    downx = upx;
                    downy = upy;
                    break;
                case MotionEvent.ACTION_UP:
//                  upx = getPointerCoords(event)[0];// event.getX();
//                  upy = getPointerCoords(event)[1];// event.getY();
//                  canvas.drawLine(downx, downy, upx, upy, paint);
//                  invalidate();
                    break;
                case MotionEvent.ACTION_CANCEL:
                    break;
                default:
                    break;
                }
                return true;
            }
        };

final float[] getPointerCoords(MotionEvent e) {
    final int index = e.getActionIndex();
    final float[] coords = new float[] { e.getX(index), e.getY(index) };
    Matrix matrix = new Matrix();
    getImageMatrix().invert(matrix);
    matrix.postTranslate(getScrollX(), getScrollY());
    matrix.mapPoints(coords);
    return coords;
}

非常感谢您的帮助

【问题讨论】:

    标签: android canvas bitmap android-canvas opacity


    【解决方案1】:

    球的形状是每个线段与前一个线段重叠的地方。您可以使用覆盖在您正在编辑的图像之上的第二张图像来解决此问题。

    将叠加图像初始化为完全透明,并使其与您正在编辑的图像大小相同。

    ImageView overlayImageView = findViewById(R.id.overlay);
    Bitmap overlayBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
    overlayBitmap.erase(0x00000000); // transparent
    overlayImageView.setImageBitmap(overlayBitmap);
    

    setAlpha()里面设置覆盖图的alpha为alpha值。

    overlayImageView.setImageAlpha((float)alpha / 255.0f);
    

    当用户画线时,在case MotionEvent.ACTION_MOVE 块中,将线画到覆盖图像上,但完全不透明。因为所有线段都是以完全不透明度绘制的,所以它们重叠的地方不会有任何球形状,但由于应用于叠加图像的 alpha 值,线仍然会显得透明。

    MotionEvent.ACTION_UP 的情况下,通过使用画布绘制调用将覆盖图像绘制到目标图像上,使用setAlpha() 中设置的 alpha 值,将线条转移到图像上,然后将覆盖图像清除为透明。

    【讨论】:

    • 对不起,您介意提供一些示例/伪代码。谢谢
    猜你喜欢
    • 2012-05-07
    • 2020-07-03
    • 2016-02-09
    • 2015-11-10
    • 1970-01-01
    • 2013-11-25
    • 2016-05-12
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多