2011-12-08 11 views
31

W mojej aplikacji na płótno chcę użyć niestandardowych pędzli, takich jak pędzle w załączonym obrazie. Proszę, pomóż mi szybko, jak mogę zrobić niestandardowe pędzle, jak załączony obraz?Jak zrobić niestandardowy pędzel na płótno w Androidzie?

W moim app zrobiłem doted linię za pomocą następującego kodu:

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

i coraz Blur i płaskorzeźba efekt używając następującego kodu:

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

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

enter image description here

Odpowiedz

20

Jak można wyraźnie zobaczyć, nie można tego osiągnąć za pomocą trywialnych efektów cieniowania/prostokątów/okręgów. Obrazy/bitmapy są używane.

Po prostu wielokrotnie narysuj mapy bitowe za pomocą canvas.drawBitmap. Ciągle rysujesz tę samą bitmapę, gdy palec się porusza.

Aby dodać niestandardowy kolor, można dodać prosty filtr.

Przykład

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

można dać jakiś przykład pędzlem z góry dostępny w kwestii jednego? – Pratik

+0

Tak, mogę to zrobić :) – poitroae

+0

Twoja odpowiedź pomogła mi narysować bitmapę jako pędzel, ale kiedy zmieniam kolor filtra koloru, to zastosowana do całej linii – Hardik

Powiązane problemy