Pertanyaan Bagaimana cara membuat kuas kustom untuk kanvas di android?


Dalam aplikasi kanvas saya ingin menggunakan kuas kustom seperti sikat di gambar terlampir. Jadi tolong seseorang membantu saya cepat bagaimana saya bisa membuat kuas kustom seperti gambar terlampir?

Dalam aplikasi saya, saya membuat garis serasi menggunakan kode berikut:

 mPaint.setPathEffect(new DashPathEffect(new float[] { 8, 8 }, 0));

dan mendapatkan efek Blur dan Emboss menggunakan kode berikut:

 mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);

 mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);

enter image description here


32
2017-12-08 09:37


asal


Jawaban:


Seperti yang dapat Anda lihat dengan jelas, tidak ada efek shader / persegi / lingkaran yang bisa mencapai hal ini. Gambar / Bitmap digunakan.

Jadi cukup berulang kali menarik menggunakan Bitmaps canvas.drawBitmap. Anda menggambar Bitmap yang sama lagi dan lagi saat jari bergerak.

Untuk menambahkan warna khusus, Anda dapat menambahkan filter sederhana.

Sebuah contoh

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.splatter_brush);
        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;
    }
}

20
2018-01-02 11:03