5

Androidで動的に生成されたビットマップがあり、境界領域が上部で完全に透明になり、少し下で完全に不透明に徐々に変化するように、上端からぼかしたいと思います。

均等に完全に透明な上端を作成する

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

完全に透明な穴の代わりにアルファグラデーション?

このようなことをどのように達成しますか:

ここに画像の説明を入力

[この場合は上端のみ]

4

3 に答える 3

9

この例を見てください: タッチ時にビットマップの特定の領域を透明にする

グラデーションペイントでそれを行う方法は次のとおりです。

Paint framePaint = new Paint();
for(int i = 1; i < 5; i++){
   setFramePaint(framePaint, i, imageW, imageH);
   myCanvas.drawPaint(framePaint);
}

...

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

            }
于 2013-01-05T14:13:09.093 に答える
1

透明の代わりに白いエッジを受け入れることができる場合は、SCREEN モードを試してください。PorterDuff.Mode.SCREENモードでは、白いピクセルは白いままで、黒いピクセルは見えなくなります。エッジが白くフェードアウトして中央が黒くなるオーバーレイ ビットマップを作成し、画像とブレンドします。これにより、白いエッジが写真の中央にフェードインするビットマップが作成されます。

于 2013-01-05T14:45:46.827 に答える