当前位置: 首页 > 知识库问答 >
问题:

我的位图用画布变黑。DrawColor(color.transparent,porterduff.mode.multiply)Android

诸葛煜
2023-03-14

我有一个使用毕加索库从URL加载图像的活动。

这个图像比屏幕大,这就是为什么在方法“OnTouch”中实现了一个代码,通过模拟地图来滚动图像。

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

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

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

}

共有1个答案

巫欣荣
2023-03-14

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

 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;

}
 类似资料:
  • 我试图创建一个自定义视图,工作简单:有一个位图显示由弧路径-从0deg到360deg。度随着一些fps而变化。 我的问题是--如何设置模式以使其工作透明? 当然,是32位PNG,带有alpha通道。

  • 在画布上画画是非常好的。即使橡皮擦也能工作得很好。问题是当画布保存为图像时,它画的是黑线,而不是橡皮擦。 为了更好地理解,我添加了屏幕、镜头和代码。 1.在擦除图的同时- 我不明白为什么橡皮移动被替换为黑色,而保存画布作为一个图像。

  • 我正在运行Ubuntu 16.04。在Android Studio上,当我试图在模拟器中运行我的应用程序时,我得到以下错误: 致命的例外:主要过程:项目名称在这里,PID: 2528java.lang.运行时间例外:画布:试图绘制太大(216090000bytes)位图。在android.view.DisplayListCanvas.throw如果不能绘制(DisplayListCanvas.ja

  • 我正在使用而不是将背景、边框和/或背景色应用到页面的某个区域(主要是因为需要页面来构建,而不需要。因为我的内容可能会持续几页)。问题是,如果坐标(x=0,y=0)意味着左下角,则图像的位置不会像预期的那样。我还想将画布定位到一个固定的位置,但是似乎不起作用。请参阅附上的原始图像和要定位在{x,y,width,height}={100f,100f,200f,200f}的图像,该图像应该在页面的底部(

  • 问题内容: 如果我有画布,则可以在其上绘制如下的位图: 然后缩放位图: 我想获得比例尺后位图的位置。如果小数位数前的位置是(0,0),小数位数后的位置有一个偏移量,那么我需要该偏移量。如何获取? 谢谢你,很抱歉这个简单的问题,新手在这里… 问题答案: 好吧,让我们尝试为此制定最佳的公式 对于objectNewY也是一样。位图的新宽度和高度当然将是旧大小和比例的倍数。

  • 我在画布上的撤消和重做操作有问题。我注意到,如果在Ondraw()方法中不使用canvas.drawbitmap,下面的代码可以工作,但是我需要绘制到位图,这样我就可以保存画布图像和加载图像。好心帮帮我。下面是我的代码。