3

目標は、複合形状を作成し、エンボス効果を追加することです。以下の図のような形状をうまく作成できます。

    woodPaint = new Paint();
    woodPaint.setAntiAlias(true);
    woodBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.wood);
    woodShader = new BitmapShader(woodBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
    woodPaint.setShader(woodShader);

    ...

    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawCircle(handleX, radius, radius, woodPaint);
        canvas.drawRoundRect(baseRectF, 25, 25, woodPaint);

        super.onDraw(canvas);
    }

画像:

次に、EmbossMaskFilter を追加します

    paintEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.1f, 8f, 5f);
    woodPaint.setMaskFilter(paintEmboss);

画像:

ご覧のとおり、エンボス マスクは 2 つの形状に別々に適用されます。形状をまとめてエンボスをオブジェクト全体に適用するにはどうすればよいですか? xfer モードをポーターダフのフレーバーに設定しようとしましたが、エンボス マスクが各シェイプに個別に適用されるという事実には影響しません。

助けてくれてありがとう!

編集: Orabîg で示されているように、エンボス フィルターを設定したペイントで 1 つのパスを描画する必要があります。注: setMaskFilter() メソッドは、ハードウェア アクセラレーションがオンになっていると機能しない数少ないメソッドの 1 つです。アクティビティのハードウェア アクセラレーションを無効にすることで、ジェリー ビーンを実行している電話で発生していた問題を解決しました。選択した任意のレベルでハードウェア アクセラレーションを無効にすることができます。

  • 応用
  • アクティビティ
  • 意見

乾杯!

4

1 に答える 1

4

エンボス効果は 1 つしか必要ないので、図形を 1 つだけ描画する必要があります。

したがって、 Canvas.drawPath() メソッドを使用する必要があります。

次のメソッドを使用して Path オブジェクトを定義する必要があります: パス定義手順 3 つの RectF オブジェクトを定義することから始めます。これは、最も左のラウンド (その後ろの円を想像してください)、最も右のラウンドのバウンディング ボックスになります。スライド : ボックス定義 box2 に使用する正しい角度を決定するために、追加の計算を行う必要がある場合があります (円と長方形全体のそれぞれのサイズによって異なります)。

幸運を !

于 2013-02-16T00:18:57.740 に答える