Pregunta Cómo hacer un pincel personalizado para lienzo en Android?


En mi aplicación de lienzo, quiero usar pinceles personalizados como pinceles en la imagen adjunta. Por favor, que alguien me ayude rápidamente, ¿cómo puedo hacer pinceles personalizados como la imagen adjunta?

En mi aplicación, hice línea de puntos usando el siguiente código:

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

y obtener el efecto Blur and Emboss utilizando el siguiente código:

 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


origen


Respuestas:


Como puede ver claramente, no se pueden lograr efectos triviales de sombreado / rectángulos / círculos. Se utilizan imágenes / mapas de bits.

Simplemente dibuja mapas de bits repetidamente usando canvas.drawBitmap. Dibujas el mismo mapa de bits una y otra vez mientras el dedo se mueve.

Para agregar un color personalizado, puede agregar un filtro simple.

Un ejemplo

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