首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制透明渐变,alpha透明度从0到1

绘制透明渐变,alpha透明度从0到1
EN

Stack Overflow用户
提问于 2013-01-05 21:08:04
回答 3查看 7.2K关注 0票数 5

我在Android中有一个动态生成的位图,我想从顶部边缘羽化,这样边界区域将在顶部完全透明,并逐渐变为完全不透明的略微下方。

创建均匀完全透明的顶边

代码语言:javascript
复制
transparentPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
Shader shader = new LinearGradient(0, 0, 0, 20,
                    Color.TRANSPARENT, Color.TRANSPARENT, Shader.TileMode.CLAMP);
transparentPaint.setShader(shader);
// the bitmap is dynamically generated beforehand
Canvas c = new Canvas(bitmap);
c.drawRect(0, 0, bitmapWidth, 20, transparentPaint);

Alpha渐变而不是完全透明的孔?

你将如何实现这样的事情:

在这种情况下,只是顶端边缘

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-05 22:13:09

看一下这个例子:Make certain area of bitmap transparent on touch

这里有一种使用渐变颜料的方法:

代码语言:javascript
复制
Paint framePaint = new Paint();
for(int i = 1; i < 5; i++){
   setFramePaint(framePaint, i, imageW, imageH);
   myCanvas.drawPaint(framePaint);
}

..。

代码语言:javascript
复制
private void setFramePaint(Paint p, int side, float iw, float ih){
                // paint, side of rect, image width, image height

                p.setShader(null);
                p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

                float borderSize = 0.1f; //relative size of border
                //use the smaller image size to calculate the actual border size
                float bSize = (iw > ih)? ih * borderSize: ih * borderSize; 
                float g1x = 0;
                float g1y = 0;
                float g2x = 0;
                float g2y = 0;
                int c1 = 0, c2 = 0;

                if (side == 1){
                    //left
                    g1x = 0;
                    g1y = ih/2;
                    g2x = bSize;
                    g2y = ih/2;
                    c1 = Color.TRANSPARENT;
                    c2 = Color.BLACK;

                }else if(side == 2){
                    //top
                    g1x = iw/2;
                    g1y = 0;
                    g2x = iw/2;
                    g2y = bSize;
                    c1 = Color.TRANSPARENT;
                    c2 = Color.BLACK;


                }else if(side == 3){
                    //right
                    g1x = iw;
                    g1y = ih/2;
                    g2x = iw - bSize;
                    g2y = ih/2;
                    c1 = Color.TRANSPARENT;
                    c2 = Color.BLACK;


                }else if(side == 4){
                    //bottom
                    g1x = iw/2;
                    g1y = ih;
                    g2x = iw/2;
                    g2y = ih - bSize;
                    c1 = Color.TRANSPARENT;
                    c2 = Color.BLACK;
                }

                p.setShader(new LinearGradient(g1x, g1y, g2x, g2y, c1, c2, Shader.TileMode.CLAMP));

            }
票数 9
EN

Stack Overflow用户

发布于 2013-01-05 22:45:47

如果您可以接受白色边缘而不是透明边缘,请尝试屏幕模式。在PorterDuff.Mode.SCREEN模式下,白色像素保持白色,黑色像素变为不可见。创建一个覆盖位图,其中的边缘是白色,在中间淡入黑色,并将其与您的图像混合。这将创建一个白色边缘淡入照片中间的位图。

票数 1
EN

Stack Overflow用户

发布于 2013-01-06 03:37:03

Romain Guy使用了一个非常类似的淡入淡出来实现你想要达到的效果,除了this effect之外,他还添加了圆角

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14172085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档