Подтвердить что ты не робот

Как сделать пользовательскую кисть для холста в android?

В моем приложении canvas я хочу использовать пользовательские кисти, такие как кисти в прикрепленном изображении. Пожалуйста, помогите мне быстро, как я могу сделать пользовательские кисти, например, прикрепленные изображения?

В моем приложении я сделал строку с использованием следующего кода:

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

и получить эффект Blur и Emboss, используя следующий код:

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

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

enter image description here

4b9b3361

Ответ 1

Как вы можете ясно видеть, никакие тривиальные эффекты шейдера/прямоугольники/круги не могут выполнить это. Используются изображения/растровые изображения.

Поэтому просто повторяйте рисование растровых изображений с помощью canvas.drawBitmap. Вы рисуете один и тот же растровый рисунок снова и снова во время перемещения пальца.

Для добавления пользовательского цвета вы можете добавить простой фильтр.

Пример

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