2012-01-19 15 views
9

Możliwy duplikat How to make custom brush for canvas in android?Jak stworzyć tego rodzaju szczotki do malowania na android

Hello friends,

jestem zbyt przyklejone do stworzenia tego rodzaju pędzla do nakładania farby, ale nie znaleźliśmy coś związane z to.

Jestem nowy w malowaniu/płótnie, więc nie mam wiedzy na ten temat, ponieważ ukończyłem go, ale dla efektu takiego jak tworzenie pędzla nie miałem nic takiego jak stworzyć/zaimplementować. Czy ktoś ma na to przykład lub kod?

muszę tego rodzaju szczotki do mojego wniosku prosty przykład Potrzeba zrozumienia:

enter image description here

Dziękuję.

+0

hej Pratik, czy znaleziono żadnych rozwiązanie tego problemu. czy możesz mi pomóc, jak osiągnąć to samo. – skygeek

Odpowiedz

8

Chyba nie ma łatwego sposobu. Znalazłem this discussion, a szczególnie następujący post jest interesujący:

Profesjonalna grafika komputerowa nigdy nie jest łatwa. Dlatego tak niewielu ludzi naprawdę sobie z tym radzi. Co gorsza, rzadko są publikowane profesjonalne techniki . Nie wiem, ile wysiłku chcecie, żebyście to zrobili, ale dam wam trochę światła. Tak więc, jeśli chcesz, możesz studiować, rozwijać i zdobyć to, co najlepsze. Jeśli wydaje ci się, że jest ci zbyt ciężko, to niech to tutaj będzie ciekawostką.

profesjonalny sposób, aby kaligraficzne szczotki w dzisiejszych czasach jest jak że:

Krzywa mistrz jest gładka, ponieważ jest sporządzony na podstawie krzywej składanej (ów). Aby uzyskać bardziej profesjonalny wynik, do , utwórz dwa splajny: jeden z uzyskanymi punktami (na przykład ze zdarzeń myszy) leżącymi nad splajtem , a drugi z punktami, takimi jak punkty kontrolne splajnu. Tak więc krzywa, którą rysujesz, to krzywa wygenerowana z interpolacji tych dwóch splajnów. W ten sposób masz "krzywą wzorcową" do narysowania.

Powinieneś również mieć "grubość główki", od której należy zastosować odmianę . Ta zmienność grubości jest obliczana zgodnie z oczekiwanym wynikiem . Bardziej powszechny rodzaj pędzla kaligraficznego to tylko , podobnie jak na łączonym obrazku: zakrzywione regiony są zwykle cieńsze niż proste. Jest to bardziej typowy typ, ponieważ większość projektantów uzyskuje tego rodzaju wyniki podczas rysowania za pomocą tabletu, więc programy te emulują to zachowanie. Efekt ten w szczególności jest zwykle obliczony z wykorzystaniem funkcji opartej na drugiej pochodnej splajnu wzorcowego . Amplituda zmiany grubości może być wartością konfigurowalną.

Cienkie i ostre końcówki łuków są wykonywane w dodatkowych obliczeniach. Czasami dobrym pomysłem jest wygładzanie nawet wariacji o grubości za pomocą splajnów lub jakiejś funkcji "ceilowej".

Jeśli wszystko wykonałeś dobrze, masz gruby (i oczywiście zamknięty) krzywa w twoich rękach. Narysuj go, korzystając z najlepszego algorytmu wypełniania, który możesz rozwinąć na .Użyj antyaliasingu, jeśli jesteś w stanie.

Wszystkie te techniki można obliczyć w czasie rzeczywistym, podczas gdy użytkownik przesuwa kursor myszy. Im więcej punktów otrzymasz, tym więcej obliczeń wykonasz, ale działa dobrze, ponieważ większość obliczeń, które już wykonałeś, jest nadal aktualna. Zazwyczaj wystarczy zrekonstruować małą (ostatnią) część.

Ostatnia sugestia: nigdy nie używaj wygładzania 2D metodą regresji funkcji , chyba że twoje punkty rzeczywiście reprezentują funkcję (musisz więc zachować "matematyczne znaczenie" punktów w jak największym stopniu). Mogę nie wyobrażać sobie wolniejszego sposobu na wygładzanie punktów, które nie mają specjalnej semantyki . Jedynym wyjątkiem jest sytuacja, gdy masz bardzo rzadkie punkty , a kolejność wprowadzania nie ma znaczenia, ale nie jest tak, gdy ktoś rysuje za pomocą pędzli.

3

Ten efekt można uzyskać, rysując teksturę bitmapową na płótnie. I przycięte trochę teksturę z obrazu, który udostępniony i używane, które jako tekstury na płótnie: -

enter image description here

obrazu tekstury: -

enter image description here

Oto moja klasa widok: -

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

Możesz użyć tego widoku w swojej działalności w następujący sposób: -

setContentView(new CanvasBrushDrawing(MainActivity.this)); 

Teraz potrzebujesz tylko lepszych plików tekstur od projektanta. Nadzieję, że to pomogło

Można zobaczyć pełny kod źródłowy na Git repo https://github.com/hiteshsahu/Dali-PaintBox

+0

Cześć Hitesh, proszę nie dodawać duplikatów odpowiedzi, odpowiedz na jedno pytanie. Jeśli znajdziesz duplikaty oznacz je flagą, jeśli nie są duplikatami, zostaw komentarz wskazujący na możliwe rozwiązanie ** **. – bummi

+0

@ Hitesh Sahu Używam ścieżek do cofania/ponawiania operacji, ale kiedy umieszczam pętlę for wewnątrz metodyDraw(), niestandardowe pędzle są stosowane wiele razy. Proszę sprawdzić moje pytanie tutaj, http://stackoverflow.com/questions/38995187/custom-brush-with-undo-redo-operation-in-android-canvas/38995449?noredirect=1#comment65385129_38995449 –

Powiązane problemy