Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 图纸/';混合';安卓系统中画布上的透明图片_Android_Canvas_Transparency - Fatal编程技术网

Android 图纸/';混合';安卓系统中画布上的透明图片

Android 图纸/';混合';安卓系统中画布上的透明图片,android,canvas,transparency,Android,Canvas,Transparency,大家好 首先,我是Android新手,目前正在尝试制作一个图像编辑应用程序。我遇到了一个问题,如果我将半透明图像移到另一个图像上,后面的图像就不会被绘制(在画布上)。请注意,这仅在我不更改/设置绘制对象的Alpha(我不想这样做-如果我更改图像的Alpha值,我希望它们“永久”更改(出于保存目的),而不仅仅是视觉) 基本上,我有以下几点: //Set up of paint object paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DIT

大家好

首先,我是Android新手,目前正在尝试制作一个图像编辑应用程序。我遇到了一个问题,如果我将半透明图像移到另一个图像上,后面的图像就不会被绘制(在画布上)。请注意,这仅在我不更改/设置绘制对象的Alpha(我不想这样做-如果我更改图像的Alpha值,我希望它们“永久”更改(出于保存目的),而不仅仅是视觉)

基本上,我有以下几点:

//Set up of paint object
paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG | Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); // I've tried a couple of these (DST_ATOP and OVERLAY)
//paint.setColor(0x808fd2ea); - Messed around with this too, just to see
这是我目前用来手动改变每个像素的alpha值的循环,当前alpha=120(±50%透明度)

下面是一张图片的截图,没有透明度(不幸的是,我需要10%的声誉才能将其包含在这篇文章中)

在这里,我使用上面的循环编辑了顶部图像每个像素的alpha值,但它仍然是“不透明的”

也许它实际上是“看到”画布背景颜色,而不是其他图像背后的颜色?这就解释了为什么当我使它透明时,它只会变得更暗。我假设我需要让画布做一些每像素的混合或者类似的事情?不幸的是,我在这方面的知识仍然非常有限,因此我不确定从这里尝试什么/去哪里

我真的非常感谢任何关于这方面的指导:)


谢谢

好吧,这太尴尬了

在某个时刻,我记得我认为问题在于绘制对象,所以我决定尝试在以下位置绘制没有位图的位图(因此为“null”):

无论如何,关键是我当时还没有读到关于Paint.setXferMode的文章。将绘制对象添加回其中解决了问题,使用PorterDuff.OVERLAY似乎实现了我想要的:)

    for(int y = 0; y < bmp.getHeight(); ++y)
    {
        int newPixelAlpha = (alpha << 24);
        for (int x = 0; x < bmp.getWidth(); ++x)
        {
            bmp.setPixel(x, y, ((bmp.getPixel(x, y) & 0xFFFFFF) | newPixelAlpha));
        }
    }
public void drawSelf(Canvas canvas, Paint paint)
{
    if(active) {
        if (!selected) {
            //paint.setAlpha(opacity);
            canvas.drawBitmap(bitmap, rect.left, rect.top, null);
        //This bit here is just if someone long-presses on the image, it gets "highlighted"  but a rectangle over it, with transparency 170. 
        //Not being used at this point
        } else {
            paint.setAlpha(170);
            canvas.drawRect(rect, paint);
            canvas.drawBitmap(bitmap, rect.left, rect.top, paint);
        }
    }
}
canvas.drawBitmap(bitmap, rect.left, rect.top, null);