2

パスをレンダリングして地球を描いています。球体のエッジは非常にシャープなので、視覚的に魅力的にするためにエッジを柔らかくしたいと考えています。

パフォーマンスのために、隠線除去は行っていません。パス上の各ポイントが表示されるかどうか (ユーザーが表示している地球の側面) を計算し、パスを最も近い隅に描画します。これを隠すために、ビュー全体にビットマップを描画し、穴を開けて地球を表示します。

エッジを柔らかくするために、放射状のグラデーション透明度を持つリングを作成しようとしています。このメソッドはマスクを作成します。

 private void createMask(int width, int height, double radius) {

        if(radius==0){return;}

        if (mask != null) {
            mask.recycle();
        }

        mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);

        // create a RadialGradient
        RadialGradient gradient = new android.graphics.RadialGradient(
                kHorizontalOffset, kVerticalOffset,
                30f, 0x00FF0000, 0xFFFF0000,
                android.graphics.Shader.TileMode.CLAMP);


        // TODO move to init()
        Paint p = new Paint();
        p.setShader(gradient);
        //p.setColor(0xFF000000);
        p.setColor(0xFFFF0000);
        p.setStrokeWidth(20f);
        p.setStrokeCap(Paint.Cap.ROUND);
        p.setStyle(Paint.Style.STROKE);
        p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));

        Canvas maskCanvas = new Canvas(mask);
        maskCanvas.drawColor(Color.BLACK);

        final RectF rect = new RectF();
        rect.set((float)(kHorizontalOffset - radius + 50), (float)(kVerticalOffset - radius + 50),
                (float)(kHorizontalOffset + radius - 50), (float)(kVerticalOffset + radius - 50));

        // draw transparent circle using the maskPaint
        maskCanvas.drawCircle(kHorizontalOffset, this.getHeight() - kVerticalOffset, (float) radius, maskPaint);

        // draw the radial gradient ring
        maskCanvas.drawArc(rect, -90, 360, false, p);

    }

私の問題は、使用する PortDuff.Mode に関係なく、この例のように常にソリッド リング (またはリングなし) が得られることです。リングはエッジからオフセットされ、何が起こっているかを確認できるように赤く着色されています。

ここに画像の説明を入力

これを機能させる方法についてのアイデアはありますか?

4

2 に答える 2

1

問題は、色をどのように設定するかだと思います。

色成分は(alpha,R,G,B)で、それぞれ0~255なので0xFFFF0000と書きます。アルファ値は透明度を設定します。したがって、アルファを FF に設定すると、00 が完全に透明であるのに対し、完全に不透明であることを意味します。アルファ値を変更してみてください..多分0x70FF0000のようなもの

于 2013-04-21T16:10:19.830 に答える