2012-01-19 19 views
9

posible duplicado How to make custom brush for canvas in android?cómo crear este tipo de cepillo de pintura en Android

Hola amigos,

soy demasiado pegado a crear este tipo de cepillo para la aplicación de la pintura, pero no encontró nada relacionado con esta.

Soy nuevo en pintar/lienzo, así que no tengo conocimiento de esto para los básicos que he completado, pero para el efecto, como crear pincel, no tenía nada que ver con cómo crearlo/implementarlo. ¿Alguien tiene un ejemplo o código para esto?

puedo necesitar este tipo de cepillo para mi aplicación sencilla un ejemplo necesidad de comprensión:

enter image description here

Gracias.

+0

bueno pratik, has encontrado alguna solución para esto. puedes por favor ayudarme a lograr lo mismo. – skygeek

Respuesta

8

supongo que no hay manera fácil. He encontrado this discussion y en particular el siguiente post es interesante:

Profesional Computer Graphics nunca es fácil. Es por eso que hay pocas personas que realmente lo aborden. Para empeorar las cosas, las técnicas profesionales rara vez se publican. No sé cuánto esfuerzo desea hacer para obtenerlo, pero le daré un poco de luz. Por lo tanto, si desea desea, puede estudiar, desarrollar y obtener de la mejor manera. Si parece demasiado difícil para usted, déjelo aquí como una curiosidad.

La manera profesional para hacer pinceles caligráficos hoy en día es como que:

La curva maestra es suave porque se dibuja sobre la base de estría (s). Para obtener el resultado más profesional, la construcción de dos ranuras: una utilizando los puntos que obtuvo (por ejemplo, de eventos de ratón) que se encuentra sobre la curva de selección y otro utilizando los puntos como los puntos de control spline. Entonces, la curva que dibuja es la curva generada por la interpolación de estas dos splines. De esta manera, tienes una "curva maestra" para dibujar.

También debe tener un "espesor maestro" en la que se debe aplicar una variación . Esta variación de espesor se calcula según el resultado que desee. El tipo más común de pincel caligráfico es solo , como en la imagen que vinculó: las regiones curvas suelen ser más delgadas que las rectas. Es el tipo más habitual porque la mayoría de los diseñadores de obtienen este tipo de resultados cuando dibujan con una tableta, por lo que los programas emulan este comportamiento. Este efecto en particular es usualmente calculado usando una función basada en la segunda derivada de la spline maestra . La amplitud de variación de espesor puede ser un valor configurable.

Las puntas curvas finas y afiladas se hacen en un cálculo adicional. A veces puede ser una buena idea suavizar incluso las variaciones de espesor con splines o algún tipo de "función ceil".

Si ha hecho todo bien, tiene un espesor (y por supuesto cerrado) curva en sus manos. Dibuja con el mejor algoritmo de relleno que puedas desarrollar.Utilice anti-aliasing si puede.

Todas estas técnicas se pueden calcular en tiempo real mientras el usuario mueve el mouse. Cuantos más puntos obtenga, más cálculos hará , pero funciona bien porque la mayoría de los cálculos que ya realizó son aún válidos. Usualmente solo necesitas reconstruir una pequeña (última) parte.

Una última sugerencia: nunca llegan 2D suavizado mediante regresión función métodos, a menos que las representan en realidad una función (por lo que necesita para mantener el "significado matemático" de los puntos tanto como sea posible). Puedo no imaginar una forma más lenta de suavizar los puntos que no tienen semántica especial . La única excepción es cuando tiene puntos muy escasos y el orden de entrada no importa, pero no es el caso cuando alguien dibuja con pinceles al .

3

Puede lograr este efecto dibujando la textura del mapa de bits en un lienzo. Coseché un poco la textura de la imagen que comparte y utiliza eso como la textura de la lona: -

imagen Textura

enter image description here

: -

enter image description here

Aquí es mi clase de vista: -

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

Puede usar esta vista en su actividad de la siguiente manera: -

setContentView(new CanvasBrushDrawing(MainActivity.this)); 

Ahora solo necesita mejores archivos de textura de su diseñador. Espero que ayudó

Se puede ver el código fuente completo de Git repo https://github.com/hiteshsahu/Dali-PaintBox

+0

Hola Hitesh, por favor no agregue respuestas duplicadas, responda una pregunta. Si encuentra duplicados, márquelos, si no hay duplicados, deje un comentario que indique la posible solución que proporcionó ** una vez **. – bummi

+0

@Hitesh Sahu Estoy usando rutas para la operación de deshacer/rehacer, pero cuando coloco el bucle for dentro del método onDraw(), los pinceles personalizados se aplican varias veces. Por favor, consulte mi pregunta aquí, http://stackoverflow.com/questions/38995187/custom-brush-with-undo-redo-operation-in-android-canvas/38995449?noredirect=1#comment65385129_38995449 –

Cuestiones relacionadas