9

重複の可能性Androidでキャンバスのカスタムブラシを作成するには?

皆さん、こんにちは、

ペイント アプリケーション用のこのタイプのブラシを作成するには行き詰まっていますが、これに関連するものは見つかりませんでした。

私はペイント/キャンバスが初めてなので、完成した基本については知識がありませんが、ブラシを作成するなどの効果については、作成/実装する方法がありませんでした。誰かがこれの例またはコードを持っていますか?

私のアプリケーションには、このタイプのブラシが必要です。理解が必要な単純な例:

ここに画像の説明を入力

ありがとうございました。

4

3 に答える 3

8

簡単な方法はないと思います。この議論を見つけましたが、特に次の投稿は興味深いものです。

プロフェッショナル コンピュータ グラフィックスは決して簡単ではありません。そのため、実際に取り組んでいる人はほとんどいません。さらに悪いことに、プロのテクニックが公開されることはめったにありません。それを手に入れるためにあなたがどれだけの努力をしたいかはわかりませんが、光を差し上げましょう。したがって、必要に応じて、最善の方法で学習、開発、取得できます。難しすぎると思われる場合は、好奇心としてここに置いてください。

最近のカリグラフィ ブラシの専門的な作成方法は次のとおりです。

スプラインに基づいて描かれているため、マスター カーブは滑らかです。より専門的な結果を得るには、2 つのスプラインを作成します。1 つはスプライン上にある (たとえば、マウス イベントから) 取得したポイントを使用し、もう 1 つはスプライン コントロール ポイントのようなポイントを使用します。したがって、描画する曲線は、これら 2 つのスプラインの補間から生成された曲線です。このようにして、描画する「マスター カーブ」が作成されます。

また、バリエーションを適用する必要がある「マスターの厚さ」も必要です。この厚みの変化は、必要な結果に従って計算されます。より一般的な種類の書道ブラシは、リンクした画像と同じです。通常、曲線領域は直線領域よりも細くなっています。ほとんどのデザイナーはタブレットで描画するときにこの種の結果を得るため、これはより一般的なタイプであり、プログラムはこの動作をエミュレートします。特にこの効果は、通常、マスター スプラインの 2 次導関数に基づく関数を使用して計算されます。厚さ変動の振幅は、設定可能な値にすることができます。

細くシャープなカーブを描く先端は計算し尽くされています。場合によっては、スプラインまたはある種の「天井関数」を使用して厚さの変化を滑らかにすることをお勧めします。

すべてを正しく行った場合は、太い (そしてもちろん閉じた) 曲線を手にすることができます。開発できる最適な塗りつぶしアルゴリズムを使用して描画します。可能であれば、アンチエイリアスを使用してください。

これらの手法はすべて、ユーザーがマウスを動かしている間にリアルタイムで計算できます。より多くのポイントを獲得するほど、より多くの計算を行うことができますが、すでに行ったほとんどの計算はまだ有効であるため、うまく機能します。通常、小さな (最後の) 部分を再構築するだけで済みます。

最後の提案: ポイントが実際に関数を表している場合を除き、関数回帰法を使用して 2D 平滑化を行わないでください (そのため、ポイントの「数学的な意味」をできるだけ維持する必要があります)。特別なセマンティクスを持たない点を滑らかにするより遅い方法は想像できません。唯一の例外は、ポイントが非常にまばらで入力順序が問題にならない場合ですが、誰かがブラシで描画している場合はそうではありません。

于 2012-01-19T10:59:47.697 に答える
3

この効果は、キャンバスにビットマップ テクスチャを描画することで実現できます。あなたが共有した画像から小さなテクスチャを切り取り、それをキャンバスのテクスチャとして使用しました:-

ここに画像の説明を入力

テクスチャ画像 :-

ここに画像の説明を入力

これが私のビュークラスです:-

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.View;

import com.serveroverload.dali.R;

public class CanvasBrushDrawing extends View {
    private Bitmap mBitmapBrush;
    private Vector2 mBitmapBrushDimensions;

    private List<Vector2> mPositions = new ArrayList<Vector2>(100);

    private static final class Vector2 {
        public Vector2(float x, float y) {
            this.x = x;
            this.y = y;
        }

        public final float x;
        public final float y;
    }

    public CanvasBrushDrawing(Context context) {
        super(context);

// load your brush here
        mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
        mBitmapBrushDimensions = new Vector2(mBitmapBrush.getWidth(), mBitmapBrush.getHeight());

        setBackgroundColor(0xffffffff);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for (Vector2 pos : mPositions) {
            canvas.drawBitmap(mBitmapBrush, pos.x, pos.y, null);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            final float posX = event.getX();
            final float posY = event.getY();
            mPositions.add(new Vector2(posX - mBitmapBrushDimensions.x / 2, posY - mBitmapBrushDimensions.y / 2));
            invalidate();
        }

        return true;
    }
}

このビューは、次のようにアクティビティで使用できます:-

setContentView(new CanvasBrushDrawing(MainActivity.this));

デザイナーからより良いテクスチャ ファイルが必要なだけです。それが役に立ったことを願っています

Git リポジトリで完全なソース コードを確認できますhttps://github.com/hiteshsahu/Dali-PaintBox

于 2016-01-09T19:06:19.553 に答える